我的应用程序中出现了随机(内存不足)崩溃,所以我开始分析我的堆。我注意到,如果我从活动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%肯定。以下是对评论图书馆的人的参考:
答案 0 :(得分:1)
我的猜测是你正在泄漏活动(这可能会泄漏它所拥有的所有变量)。确保任何要求您传递上下文的操作系统调用都已取消注册,您没有任何包含该活动引用的对象(特别是通过保持上下文)并且您在onDestroy中清空了所有内容或onStop(并在所有主要对象中也这样做)。
如果这还不够,请查看您的hprof,看看在您杀死活动后谁正在处理什么大对象以及谁持有引用。修复并重复。
答案 1 :(得分:1)
听起来我每次都要开始一项新活动,而不是切换到已加载的活动。尝试在意图上设置标记,以便在切换活动时包含 Intent.FLAG_ACTIVITY_REORDER_TO_FRONT 。
答案 2 :(得分:0)
对我而言,它可能是您正在使用的图像。 BitmapFactory from Android创建不可变的位图,因此您对这些位图所做的任何更改都将与原始图像分开。
更糟糕的是,即使你告诉它recycle,它也将取决于你的引用是否会被垃圾收集。