DDMS堆 - 1字节数组(byte [],boolean [])

Tob*_*sen 24 android ddms

我在Android应用程序中遇到了一些内存泄漏.我已经用MAT来分析内存使用情况.但是我在Eclipse中的DDMS观点中有一个问题,1字节数组[byte [],boolean [])是什么意思?

在此输入图像描述

这是否适用于我的申请?你可以看到这是一个很大的内存泄漏问题,这个问题总是会增加,其余的会随机增加和减少.我的猜测是GC没有抓住这种类型.有人能用这些小信息解释为什么会这样吗?

Lui*_*uis 10

一个字节数组是组织为单字节数组的任何数据结构的名称.在你的情况下和那个大小,我打赌在Bitmap或Drawble.

内存泄漏的最常见原因是静态对象未正确管理并保持对以下内容的引用:

  • 上下文
  • 视图(包含对上下文的引用(也可能包含位图)
  • 线程(GC不容易收集)
  • 处理程序(其中包含对上下文的引用)

其中大多数都可以解决,确保在不再需要时将对象设置为null.

问候.


zap*_*apl 9

A byte和a boolean各1个字节.如果你有一个数组,你有一个"1字节数组".

ByteBuffer例如,A 应该在内部持有其中一个.

你总共有614个,其中最小的一个是byte[24](或boolean[24]),最大的是3MB.他们一起使用104MB.

如果不再引用它们,GC将删除它们.

比如当你放

private static byte myArray[] = new byte[3 * 1024 * 1024];
Run Code Online (Sandbox Code Playgroud)

在你的一个类中,从不将它设置回null(myArray = null)然后这个不能被垃圾收集,因为另一个Object有一个对它的引用.对象将是类本身(如String.class).由于从不卸载类,因此无法对类对象进行垃圾回收.(它们被它们引用,它们ClassLoader本身可以被另一个引用/加载ClassLoader,你不能创建对象并使用没有它们的类 - 它们需要保留并且需要保持对它们的类​​的引用)

它通常不是那么简单,但通常从static某个地方开始.

在MAT中(在强制GC之后)查看不再用于保持活动的对象的引用链,并标识保存引用的一个Object.null在代码中设置一个,你的泄漏就消失了.这里详细解释:

http://android-developers.blogspot.de/2011/03/memory-analysis-for-android.html