加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 02:30:43 所属栏目:Java 来源:网络整理
导读:所以,我正在研究 android中的游戏,我正在检查堆和分配,看看内存是否有任何问题,什么不是.当我到达堆时,它告诉我它已经为我的游戏分配了33 MB,并且31 mb被分配给1字节数组类型.我经历了试图弄清楚为什么这么大,但我没有运气,也不知道该寻找什么.有没有人有任
所以,我正在研究 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.如何使用固定大小的最大触摸事件数组并更新它而不是每次创建一个新事件?它是一个处理两者的单个线程,所以不应该担心它.

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

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

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读