【发布时间】:2012-03-26 19:37:14
【问题描述】:
我昨天整天都在为此苦苦挣扎,但仍然无法弄清楚,所以我认为是时候解决它了。所以我有一个应用程序,它有两个列表视图作为两个活动中的片段,每个选项卡一个。
我打开了两个模拟器:2.3.3 64 sd 卡,2.2 64 sd 卡
和一个设备:带有 1GB sd 卡的三星 Galaxy
当我在 2.3.3 模拟器上运行它时: 我去第一个列表,向下滚动。每行都有一个使用 DrawableBackgroundDownloader 类从 url 延迟加载的图像,该类可以在此处找到:
Lazy load of images in ListView
然后我转到第二个列表并开始向下滚动。 GC 已经出现在第一个列表中,但现在它在前几个项目出现后显示错误。
这是开始显示错误时的输出:
“正在下载图像”意味着图像正在像提到的类一样在线程中下载。
我可以控制图像,所以我知道每个列表有大约 40 个项目,两个列表的所有图像总共有大约 2MB
堆大小保持不变约 3.5MB,但您可以看到外部分配上限从之前的 10MB 跃升至 12MB 和 14244Kb,然后是 16291Kb,然后是 18328Kb,然后突然分配失败。
这里发生了什么?
因为这是 2.3.3 如果我在这里使用 MAT 并分析堆转储。它只有 2.8MB。我知道位图不在堆中(仅引用它),因此我很难分析那里的泄漏。无论如何,它似乎没有与堆连接,而是与外部内存连接(gc 这么说,模拟器中没有 OOME)
错误时堆的直方图
当我在 2.2 设备上运行它时 - 它可以工作,并且相同的操作不会导致 GC 外部分配失败。 然而,在成功地将第二个列表滚动到最后之后,来自 GC 的样本看起来像这样:
03-16 15:30:25.440: D/dalvikvm(19622): GC_EXTERNAL_ALLOC freed 6910 objects / 836600 bytes in 40ms
为什么在这里表示为对象? 836600 = ~ 816kb 是什么意思?
当我在 2.2 模拟器上运行它时,我也会遇到 GC 错误,但比 2.3.3 的情况要晚一些。 我将补充一点,在模拟器中将 sd 卡更改为 512 没有区别。
我还是 Android 新手, 我会感谢任何提示或指出我推理中的错误
【问题讨论】:
标签: android android-emulator garbage-collection