Android应用内存堆不断增长

时间:2013-01-25 19:19:42

标签: android memory-management memory-leaks garbage-collection heap

我的应用程序中出现了随机(内存不足)崩溃,所以我开始分析我的堆。我注意到,如果我从活动A转到活动B,堆增加(由于延迟加载许多图像)从27 MB增加到35 MB。但是,当我完成()活动B返回活动A时,即使使用GC操作,堆大小也保持不变!

令人讨厌的是再次进入活动B再次将堆增加到42 MB。我可以这样做,并且堆只会不断增加。

这是我正在使用的延迟图像加载库:

LazyList https://github.com/thest1/LazyList

这些是Heap的截图

之前:http://i.stack.imgur.com/7eTzm.png

之后:http://i.stack.imgur.com/txeC6.png

转换后的堆转储文件可根据要求提供

更新

从我的调试来看,似乎来自LazyList库的问题,但我仍然不是100%肯定。以下是对评论图书馆的人的参考:

https://github.com/thest1/LazyList/issues/20

3 个答案:

答案 0 :(得分:1)

我的猜测是你正在泄漏活动(这可能会泄漏它所拥有的所有变量)。确保任何要求您传递上下文的操作系统调用都已取消注册,您没有任何包含该活动引用的对象(特别是通过保持上下文)并且您在onDestroy中清空了所有内容或onStop(并在所有主要对象中也这样做)。

如果这还不够,请查看您的hprof,看看在您杀死活动后谁正在处理什么大对象以及谁持有引用。修复并重复。

答案 1 :(得分:1)

听起来我每次都要开始一项新活动,而不是切换到已加载的活动。尝试在意图上设置标记,以便在切换活动时包含 Intent.FLAG_ACTIVITY_REORDER_TO_FRONT

See this

答案 2 :(得分:0)

对我而言,它可能是您正在使用的图像。 BitmapFactory from Android创建不可变的位图,因此您对这些位图所做的任何更改都将与原始图像分开。

更糟糕的是,即使你告诉它recycle,它也将取决于你的引用是否会被垃圾收集。