8

有时,尤其是在我的应用程序中实现新功能时,我会使用 DDMS + HPROF 来分析内存和堆使用情况。由于该应用程序似乎没有任何性能-ANR 问题并且一切运行顺利,最初我并不关心它 - 但现在,我看到它的大小几乎总是相同,我想知道它到底能做什么是。

每次运行 HPROF 时,我都会检查泄漏嫌疑人选项卡。总会有一个android.graphics.Bitmap实例占用所有已用堆的大约 25%。

泄密嫌疑人

我想进一步了解那是什么,所以我打开了支配树,看到了这个:

支配树

所以基本上有一个巨大的byte[]实例保留了大量的堆,并且永远不会被释放。根据this,我复制了 that 的值byte[],将其转储到.data文件中,用 Gimp 打开,结果如下:

PNG

所以基本上,它看起来像 PNG 图像的“alpha(0)”部分。考虑到以下事实:

  • 我所有的图像文件的大小都小于 8K
  • 只有其中一些是PNG - 剩下的我能够转换为JPG,我做到了
  • 不管我是否添加更多图像,从应用程序开始(4 个月前)开始,图像的大小byte[]始终大致相同
  • 为了调试它,我尝试从and文件夹中删除任何图像文件并在没有任何可绘制资源的情况下运行应用程序,并且仍然存在drawabledrawable-xxxbyte[]
  • 我删除了几乎所有的布局,只保留了基本的功能和相同的结果
  • 支配树中,根类是android.graphics.Bitmap

任何人都知道这是什么byte[],如果我应该做些什么来释放它?

任何帮助表示赞赏!

4

1 回答 1

8

只是为了澄清一些事情:

  • 应用程序中的图像/可绘制对象以android.graphics.Bitmap.
  • 从 Android 3.0(API 级别 11)开始,像素数据与关联的位图一起存储在 Dalvik 堆中。(管理位图内存
  • “巨大的字节[]”可能是夸大其词,因为它刚刚超过 1MB 的堆空间。

泄漏嫌疑人报告可能会有所帮助,但在这种情况下,考虑到其最大的嫌疑人只是超过 1MB 的内存,它并不能告诉你太多。现代设备提供 64MB 以上的堆。

让我们计算一下这个位图的内存需求。此位图占用堆上的 1,127,584 个字节。如果我们假设此位图是使用 ARGB_8888 配置的,则每个像素使用 4 个字节,这意味着您的图像包含 281,896 个像素(或大约 530x530)。这听起来对你正在做的事情不合理吗?

此外,请考虑 Android 在不同“桶”中为可绘制对象扩展的方式:mdpi、hdpi、xhdpi 等。假设您在mdpi桶中有一个 200x200 的图像,并且您正在xhdpi设备上打开应用程序。此图像将缩放为两倍大,并且设备上的分辨率为 400x400。因此,虽然 200x200 图像可能不会占用太多堆空间 (200 x 200 x 4 = 160 kb ),但 400x400 图像将需要相对较大量 (4x) 的堆空间 (400 x 400 x 4 = 640 kb )。有关这方面的更多信息,请参阅支持多个屏幕

一个很好的工具,可以快速计算与图像桶的差异:Android DPI Calculator

您说您删除了一些可绘制对象,但还剩下什么?您是否考虑过可能来自外部库的可绘制对象?

回答你的最后一个问题:任何人都知道这个 byte[] 是什么,我是否应该做些什么来释放它?

我会说:堆上的这少量内存没什么好担心的。如果它困扰您,请密切关注它并确保它不会超出看起来实际的范围。如果您仍然怀疑内存泄漏,请在屏幕之间导航并观察堆是否继续增长。假设您没有缓存位图,堆在两个屏幕之间来回导航时应保持一致/可预测的大小

附带说明一下,DDMS 使得动态监控堆大小变得非常容易。在您准备好开始之前,不需要 HPROF 转储。看看Using DDMS。请特别注意“Cause GC”按钮,因为需要它来触发初始堆大小的更新。

--更新--

为了进一步回答这个问题,我有一个不受支持的怀疑是应用程序的一些资产(系统资产/纹理?)被加载到您的应用程序的内存空间中。在此处查看幻灯片 64:Android 4.4 中的新增功能

Android 4.4 现在生成一个包含所有框架资产的单一纹理,由所有进程共享。这在每个过程中节省了一点内存,但它也有助于批处理和合并绘图操作以自动优化应用程序。

这似乎意味着内存用于运行 4.4 之前版本的每个应用程序中的系统位图/可绘制对象。如果是这种情况,我会质疑这 1MB 是否就是那个空间。我想知道您是否可以在 4.4 设备/模拟器上运行您的应用程序并查看是否使用了相同的内存。

作为另一项测试,您是否尝试过检查准系统应用程序的内存使用情况(删除所有可绘制对象等)?

于 2014-01-29T08:40:58.880 回答