使用 1 Mb 堆的奇怪位图

Posted

技术标签:

【中文标题】使用 1 Mb 堆的奇怪位图【英文标题】:Strange Bitmap using 1 Mb of Heap 【发布时间】:2013-09-02 03:56:48 【问题描述】:

出于好奇,我最近使用 Eclipse Memory Analyzer 测试了我的 Android 应用程序的内存泄漏。

我遇到了一个奇怪的位图,其大小为 512 x 512 像素,使用了大约 1 兆字节我的设备堆内存。

我检查了我的 drawables 文件夹,但找不到那个大小 (512 x 512) 的位图。

我开始在谷歌上搜索并遇到了这个问题,用户解释了如何在内存分析器中获取“内存泄漏”引用背后的实际图像:

MAT (Eclipse Memory Analyzer) - how to view bitmaps from memory dump

我按照教程并在 GIMP 的帮助下提取了以下图像:

所以我的问题是:

那是什么? 它在我的应用程序堆中做了什么? 如何摆脱它? 其他人的堆中是否有相同的位图?

注意事项:

在我的 drawables 文件夹中没有像那样的位图 我的应用使用的最大位图是 140 x 140 像素 我感觉这个位图不知何故来自系统 位图在应用启动后立即处于堆中 - 无需任何用户交互 我正在调试 HTC One S,android 4.1 Cyanogen Mod(屏幕 540 x 960) 我没有使用外部库

更新

在Selvin's 的建议和我个人认为这可能是系统问题的帮助下,我测试了我的另外两个应用程序。

我测试的两个应用程序还在内存分析器中显示了相同的位图,消耗的字节数完全相同:

此外,我发现:

Bitmap 的来源始终与应用的 LAUNCHER Activity 相关联。

那该怎么办呢? 有没有办法摆脱它?

由于我在我的应用程序中执行内存密集型操作,我希望有尽可能多的可用堆。

【问题讨论】:

也许它存在于您应用的构建路径中包含的库之一中,如果有的话。 好主意,但我的项目中没有包含库。 只是我的 2 美分:在你的地方,我会检查其他项目(fx.: new one)是否也有相同的位图......如果是,你的假设:I have a feeling that this Bitmap somehow comes from the system会是真的,我会停止担心这个:) 我会检查并报告,谢谢。 我在堆中也有一个奇怪的 1MB 位图。似乎每个应用程序都有它。 【参考方案1】:

Android 使用的默认窗口背景是 512x512 图像(您看到的带有深色主题的深蓝渐变或带有浅色主题的灰白色渐变)。从 Android 4.2 开始,在支持的设备上,此图像将替换为程序渐变。

请注意,此位图通常会在 Zygote 中加载并由所有应用程序共享。如果转储不排除 Zygote 分配的对象,它可能会出现在堆转储中。

如果你有兴趣,这里是我所说的两个 512x512 背景:

https://github.com/android/platform_frameworks_base/blob/jb-mr0-release/core/res/res/drawable-nodpi/background_holo_dark.png

https://github.com/android/platform_frameworks_base/blob/jb-mr0-release/core/res/res/drawable-nodpi/background_holo_light.png

【讨论】:

感谢您的解释。我一直有一种感觉,这不是我的应用程序的问题。即使在较低的Android版本上,是否有可能释放此图像使用的内存/用渐变替换图像? 有没有办法在 MAT 中排除 Zygote 分配的对象?还是在转储期间?

以上是关于使用 1 Mb 堆的奇怪位图的主要内容,如果未能解决你的问题,请参考以下文章

对 Redis 位图进行获取操作返回奇怪的输出

如何优雅地使用Redis之位图操作

如何优雅地使用Redis之位图操作

翻转位图后正确释放资源

跟踪位图和矢量的问题 (AS3)

Android:如何重用或限制位图的数量