【问题标题】:android (2.3.3 / 2.2) - external allocation / GC output and MAT analysisandroid (2.3.3 / 2.2) - 外部分配/GC输出和MAT分析
【发布时间】: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


    【解决方案1】:

    您有内存泄漏,应该回收您不使用的每个图像。也许也将它们缩小到每个 imageview 的尺寸。我自己也一直在纠结这个问题太久了。如何有效管理 X 数量的图像。跟踪您拥有的每个位图并知道它们何时分配给 imageView,然后回收所有其他位图。

    如果您知道有多少图像及其尺寸,那么您可以计算出比您在任何给定时刻处理 50 张图像的能力。

    获取 ICS 手机或 Honeycomp 平板电脑。位图外部内存分配在 mat 中可见,您可以找出泄漏的位置。

    【讨论】:

      【解决方案2】:

      这是不久前向我推荐的。从来没用过,但很多人喜欢它。ListViewImageManager

      【讨论】:

        【解决方案3】:

        谢谢大家的建议; 我最终使用了这段很棒的代码来处理图像,强烈推荐 https://github.com/nostra13/Android-Universal-Image-Loader

        【讨论】:

          猜你喜欢
          • 2017-09-10
          • 2015-06-22
          • 1970-01-01
          • 2011-10-17
          • 2017-01-08
          • 1970-01-01
          • 2017-12-23
          • 2011-08-05
          • 1970-01-01
          相关资源
          最近更新 更多