使用 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 堆的奇怪位图的主要内容,如果未能解决你的问题,请参考以下文章