Android应用程序内存堆不断增长

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

我的应用程序经常发生随机(内存不足)崩溃,所以我开始分析我的堆。我注意到,如果我从 Activity A 转到 Activity B,堆会从 27 MB 增加(由于延迟加载许多图像)到 35 MB。但是,当我 finish() Activity B 返回到 Activity A 时,即使进行 GC 操作,堆大小也保持不变!

烦人的是,再次进入 Activity B 会将堆增加到 42 MB。我可以多次这样做,堆只会不断增加。

这是我正在使用的惰性图片加载库:

惰性列表 https://github.com/thest1/LazyList

这些是堆的截图

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

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

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

更新

从我的调试来看,这似乎是 LazyList 库的问题,但我仍然不是 100% 确定。这是对图书馆评论的人的引用:

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

最佳答案

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

如果这还不够,请查看您的 hprof,看看在您终止 Activity 之后周围有哪些大对象以及谁持有引用。修复并重复。

关于Android应用程序内存堆不断增长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14528884/

相关文章:

c - SDL内存使用

C++ 字符串扩展导致分配错误

c++ - 写访问冲突 this->head 在 pop_front 中是 0xDDDDDDDD

HTC Desire : run-as flaw? 上的 Android native 调试 (ndk-gdb)

android - 如何通过使用 Intent 导航到 'android.intent.action.MAIN' Activity ?

c - 为什么 calloc 需要两个参数而 malloc 只需要一个参数?

c# - 即使处置了集线器连接,也不会从堆中删除 SignalR 对象

c - Mongodb-c-driver 工作后出现段错误

android - 名为 '*Locked()' 的方法在 Activity 相关类中意味着什么?

android - 如何在android中强制设置后置摄像头并禁用前置摄像头