安卓堆内存:1字节数组类型异常巨大。

4
所以,我正在开发一个Android游戏,并检查堆和分配情况,以查看内存是否存在任何问题。当我到达堆时,它告诉我为我的游戏分配了33mb,其中31mb是分配给1字节数组类型的。我试图找出为什么这个数字如此之大,但没有成功,也不知道该从哪里入手。有人有任何想法吗?提前感谢!如果您需要更多信息,请告诉我。

Will

编辑:

我在发布这篇文章时不太清楚发生了什么事情,很抱歉。

基本上,我制作了一个简单的触摸屏检测器,代码如下所示,当我运行它时,我决定检查堆。正如我上面所说,对于我所做的事情来说,它非常大,只需获取点并使用绘图将圆圈粘贴在其上即可。

    public void onDraw(Canvas c)
    {
        c.drawColor(Color.BLACK);
        Point[] touchPlacesHolder = touchPlaces;
        for(int i = 0; i < touchPlacesHolder.length; i++)
        {
            c.drawCircle(touchPlacesHolder[i].x, touchPlacesHolder[i].y, 100, paint);
        }
    }

    public boolean onTouchEvent(MotionEvent event){
        touchPlaces = new Point[event.getPointerCount()];
        for (int i = 0; i < event.getPointerCount(); i++) 
        {
            touchPlaces[i] = new Point((int) event.getX(i), (int) event.getY(i));
        }
        return true;
    }

我正在通过意图将此活动链接到另一个按钮来运行它,代码如下。我不确定是否与我链接两个活动的方式有关,也许我在那里造成了内存泄漏。
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    final Window win = getWindow();
    win.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.main);

    final Button newGame = (Button) findViewById(R.id.new_game_button);
    newGame.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            // Perform action on clicks
            Intent intent = new Intent(v.getContext(), Platformer.class);
            startActivity(intent);
        }
    });
    final Button levelEditor = (Button) findViewById(R.id.level_editor);
    levelEditor.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            Intent intent = new Intent(v.getContext(), LevelEditor.class);
            startActivity(intent);
        }
    });
}

如您所见,我在第二段代码中的按钮上附加了另一个活动,但我想问一下更简单的示例,因为它们都使用相同数量的内存,尽管其中一个使用位图,而另一个则没有。
所以,我的问题基本上是,为什么这么简单的东西需要如此大的堆,并且当像“切断绳索”这样复杂得多的东西只有一半大小时,它会使用这么多堆。 谢谢!
再次编辑:
我刚刚将清单更改为从最简单的开始,并省略了主菜单和其他活动。 多点触摸测试器使用了其13 MB堆中的约12 MB。 我对菜单做了同样的事情,它大约分配了25 MB,并且大部分正在使用它,而我没有展示的另一个类也使用了约25个。
因此,我猜额外使用的内存来自于它将菜单保存在内存中,但我不确定为什么它在首次使用菜单时使用了这么多的内存。 有什么办法可以解决这个问题或者修复它在内存中的保留方式吗?
1个回答

1

针对速度和内存的可能优化:

1.考虑使用最大触摸事件的固定大小数组,并更新它,而不是每次都创建新的数组。因为它是一个单线程处理所有问题,所以不需要担心。

2.仅使需要更新的区域失效,这可以提高速度。

3.只在需要更新之前更新触摸事件。

4.如果游戏不确定,但可以使用一个固定大小位图并将其写入,而不是保存触摸事件。

5.由于这是一个游戏,大部分内存可能用于图像、声音和视频。尝试检查是否存在问题。由于您已经检查了的类是1字节数组,那么可能是图像的问题。有关加载重型资源的更多信息,请参见:http://developer.android.com/training/displaying-bitmaps/index.html

如果堆大小很大,则可能表明您在短时间内创建了许多小对象或少量大对象,因为垃圾收集器需要一些时间才能执行操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接