gpt4 book ai didi

android - HPROF 后我的应用程序中有巨大的 byte[]

转载 作者:塔克拉玛干 更新时间:2023-11-02 18:50:53 25 4
gpt4 key购买 nike

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

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

Leak suspects

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

Dominator tree

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

PNG

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

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

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

感谢任何帮助!

最佳答案

只是澄清一些事情:

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

Leak Suspects 报告可能会有所帮助,但在这种情况下,考虑到其最大的嫌疑人只是超过 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)。有关这方面的更多信息,请参阅 Supporting Multiple Screens .

快速计算图像桶差异的好工具:Android DPI Calculator

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

回答你的最后一个问题:有谁知道这个字节[]是什么,我是否应该做些什么来释放它?

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

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

-- 更新 --

为了进一步回答这个问题,我有一个未经证实的怀疑是某些应用程序的 Assets (系统 Assets /纹理?)被加载到您的应用程序的内存空间中。在此处查看幻灯片 64:What's new in Android 4.4 .

Android 4.4 now generates a single texture containing all the framework assets, shared by all processes. This saves a bit of memory in every process but it also helps batching and merging drawing operations to optimize applications automatically.

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

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

关于android - HPROF 后我的应用程序中有巨大的 byte[],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21291222/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com