Android Heap 1-Byte数组类型非常大

时间:2012-01-14 06:56:56

标签: java android heap

所以,我正在研究android中的游戏,我正在检查堆和分配,看看内存是否有任何问题,什么不是。当我到达堆时,它告诉我它已经为我的游戏分配了33 MB,并且31 mb被分配给1字节数组类型。我经历了试图弄清楚为什么这么大,但我没有运气,也不知道该寻找什么。有没有人有任何想法?提前致谢!如果您需要更多信息,请与我们联系。

威尔

编辑:

我对发生的事情并不十分清楚,对不起,我发布时已经很晚了。

基本上我做了一个简单的多点触控检查器,下面的代码,当我运行它时,我决定检查堆。正如我上面说的那样,它对于我正在做的事情来说非常大,只是得到点并用它画一个圆圈

    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;
    }

我通过意图将它链接到另一个按钮来运行此活动,代码如下。我不确定它是否与我连接2的方式有关,也许我在那里造成了内存泄漏。

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 mbs。我为菜单做了同样的事情,它分配了大约25 MB,并且使用了大部分,而我没有显示的其他类也使用了大约25个。

所以,我猜测在内存中保存菜单会占用额外的内存,但我不知道为什么它首先会为菜单使用这么多内存。知道如何修复它或修复它在内存中保存它的方式吗?

1 个答案:

答案 0 :(得分:1)

速度和内存的可能优化:

1.如何使用固定大小的max touch事件数组并更新它而不是每次都创建一个新事件?它是一个处理两者的单个线程,所以不应该担心它。

2.仅验证应更新的区域。这可以提高速度。

3.仅在您知道要更新之前更新触摸事件。

4.不确定游戏是什么,但您可以使用固定大小的位图并写入,而不是保存触摸事件。

5.因为这是游戏,大部分内存可能用于图像,声音和视频。试着检查一下这是不是一个问题。因为您检查的类是1字节数组,所以可能是图像的情况。有关加载大量资源的更多信息,请检查: http://developer.android.com/training/displaying-bitmaps/index.html

具有较大的堆大小可能表示您在短时间内创建了许多小对象或一些大对象,因为gc需要一些时间才能执行某些操作。