DDMS堆 – 1字节数组(byte ,boolean )

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

在这里输入图像说明

这是特定于我的应用程序? 你可以看到这是大的内存泄漏问题,这个问题总是会增加,其余的会随机增加和减less。 我的猜测是GC不能捕捉这种types。 有人可以解释为什么会发生这种情况吗?

Solutions Collecting From Web of "DDMS堆 – 1字节数组(byte ,boolean )"

一个byte和一个boolean都是1个字节。 如果你有一个“1字节数组”的数组。

例如一个ByteBuffer应该在内部保存其中的一个。

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

如果GC不再被引用,GC将被清除。

例如,当你把

 private static byte myArray[] = new byte[3 * 1024 * 1024]; 

在你的一个类中,永远不会将它设置为null( myArray = null ),那么这个不能被垃圾收集,因为另一个对象有一个对它的引用。 该对象将是类本身(如在String.class )。 类对象不能垃圾回收,因为类永远不会被卸载。 (它们是由它们的ClassLoader引用的,它本身可以被另一个ClassLoader引用/加载,并且不能创build对象并在没有它们的情况下使用它们 – 它们需要保留,并且需要保留对它们类的引用)

这通常不是那么简单,但通常从static地方开始。

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

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

一个字节的数组就是任何数据结构被指定为一个单字节数组。 在你的情况下,这样的大小,我会赌在一个位图或一个Drawable。

内存泄漏的最常见原因是没有正确pipe理静态对象,并持有对以下内容的引用:

  • 上下文
  • 视图(持有参考上下文(也可能是位图)
  • 线程(不容易被GC收集)
  • 处理程序(持有参考上下文)

他们中的大多数都可以解决,确保您不需要长时间将对象设置为null。

问候。

今天晚上我跑到这个问题,差不多我检查了所有的代码,但我找不到任何东西。

我所做的是从intelij启动应用程序,然后按主页button,再次打开应用程序。 每次应用程序堆加倍。

最后,我发现,当我从亚行启动应用程序,并按主页button,再次打开应用程序,它不会带回旧的活动,它只是开始一个新的。 当我按下完成,它开始循环所有的人。 这就像他们被视为两个不同的意图。 所以我把清单中的主要活动放在android:launchMode="singleTop"上,并解决了这个问题。

虽然这不是这个问题的主要原因,但是如果你遇到这个问题,在任何事情之前都要检查一下。 浪费了三四个小时。