我在Android应用程序中遇到了一些内存泄漏。我已经使用MAT来分析内存使用情况。但是我在Eclipse中的DDMS观点中有一个问题,1字节数组[byte [],boolean [])是什么意思?
这是否适用于我的申请?您可以看到这是一个很大的内存泄漏问题,这个问题总是会增加,其余的会随机增加和减少。我的猜测是GC没有抓住这种类型。有人能用这些小信息解释为什么会这样吗?
答案 0 :(得分:10)
一个字节数组是组织为单字节数组的任何数据结构的名称。在你的情况下和那个大小,我打赌在Bitmap或Drawble。
内存泄漏的最常见原因是静态对象未正确管理并持有对以下内容的引用:
大多数都可以解决,确保在不再需要时将对象设置为null。
问候。
答案 1 :(得分:9)
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
)然后这个不能被垃圾收集,因为另一个Object有一个对它的引用。对象将是类本身(如String.class
中所示)。由于从不卸载类,因此无法对类对象进行垃圾回收。 (它们由ClassLoader
引用,它们本身可以被另一个ClassLoader
引用/加载,你不能创建对象而没有它们使用类 - 它们需要保留并且需要保留引用他们的班级)
通常不是那么简单,但通常从static
开始。
在MAT中(在强制GC之后)查看不再用于保持活动的对象的引用链,并标识保存引用的一个Object。在代码中将其设置为null
,您的泄漏就会消失。这里有更详细的解释:
http://android-developers.blogspot.de/2011/03/memory-analysis-for-android.html
答案 2 :(得分:3)
我今晚遇到了这个问题,几乎我检查了每一段代码,但我找不到任何东西。
我所做的是从intelij启动应用程序,然后按主页按钮再次打开应用程序。每次应用堆加倍。
最后,我发现当我从亚行启动应用程序并按下主页按钮并再次打开应用程序时,它不会恢复旧活动,它只是启动一个新活动。当我按下完成后,它开始循环通过所有这些。它们被视为两种不同的意图。所以我将android:launchMode="singleTop"
放在清单中的主要活动上,它解决了问题。
虽然这不是导致此问题的主要原因,但如果您遇到此问题,请在此之前进行检查。我浪费了三四个小时。