14

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

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

在此处输入图像描述

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

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

MAT (Eclipse Memory Analyzer) - 如何从内存转储中查看位图

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

在此处输入图像描述

所以我的问题是:

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

笔记:

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

更新

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

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

在此处输入图像描述

此外,我能够发现:

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

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

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

4

1 回答 1

17

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

于 2013-09-05T18:13:48.480 回答