奇怪的位图占用了1 Mb的堆空间

14

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

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

enter image description here

我检查了我的drawable文件夹,但找不到这个尺寸(512 x 512)的位图。

我开始搜索并找到了这个问题,其中一个用户解释了如何在Memory Analyzer中获取“内存泄漏”引用后面的实际图像:

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

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

enter image description here

所以我的问题是:

  • 那是什么?
  • 它为什么会在我的应用程序堆中?
  • 我该如何除掉它?
  • 其他人的堆中是否有相同的位图?

注:

  • 我的drawable文件夹中没有看起来像那个的位图。
  • 我应用程序使用的最大位图是140 x 140像素。
  • 我有一种感觉,这个位图可能来自系统。
  • 该位图在应用启动后立即出现在堆中 - 没有任何用户交互。
  • 我在HTC One S上进行调试,Android 4.1 Cyanogen Mod(屏幕540 x 960)。
  • 我没有使用外部库。

更新:

Selvin的建议下,以及我个人认为这可能是系统问题的感受协助下,我测试了我的其他两个应用程序。

我测试的这两个应用程序在内存分析器中显示了相同数量的字节所占用的位图:

输入图片描述

此外,我还发现:

该位图的来源始终与应用程序的LAUNCHER活动相关联。

那该怎么办呢?有什么方法可以摆脱它吗?

由于我的应用程序需要进行大量的内存操作,因此我希望尽可能多地使用堆。


1
也许它存在于您应用程序构建路径中包含的某个库中。 - Ali Alnoaimi
好主意,但我的项目中没有包含任何库。 - Philipp Jahoda
1
只是我个人的看法:如果我在你的位置,我会检查其他项目(例如新项目)是否也有相同的位图... 如果是这样,那么你的假设:“我有一种感觉这个位图某种程度上来自系统”将是正确的,我就不会再担心这个了 :) - Selvin
我会检查并回报,谢谢。 - Philipp Jahoda
我在堆中也有一个奇怪的1MB位图。似乎每个应用程序都有它。 - vortexwolf
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


谢谢您的解释。我一直觉得这不是我的应用程序的问题。是否有可能在较低版本的Android上释放此图像使用的内存/用渐变替换图像? - Philipp Jahoda
3
MAT 中是否有一种方式可以排除 Zygote 分配的对象?或者在转储期间排除这些对象? - auselen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接