7

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

烦人的事情是,再次执行活动 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

4

3 回答 3

1

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

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

于 2013-01-25T19:23:18.510 回答
1

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

看到这个

于 2013-01-25T19:42:24.607 回答
0

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

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

于 2013-01-25T23:41:56.330 回答