堆分析工具报告的位图潜在内存泄漏,但没有应用程序使用的位图

Potential memory leak of bitmap reported by heap analysis tools but no bitmaps used by App

我的应用 运行 正常(即没有崩溃)。在测试期间,我一直在调查内存使用情况。我使用 Android Studio (AI-141.2006197) DDMS 输出 Dump HPROF 文件,然后在 Eclipse Memory Analyzer 中打开它。此工具描述了一个泄漏嫌疑人:

One instance of "android.graphics.Bitmap" loaded by "<system class loader>" occupies 
2,536,984 (40.81%) bytes. The memory is accumulated in one instance of "byte[]" 
loaded by "<system class loader>".

Keywords
byte[]
android.graphics.Bitmap

来自 dominator_tree 的更多信息:

在过去的一天里,我将我的应用程序的开头 activity 和片段剥离到最基本的部分,删除了所有开头和对位图的引用,删除了菜单、服务等所有内容。剩下的就是一个包含 1 个片段的 activity。该片段有一个 ListView,每个列表项都有一个简单的 TextView。不使用位图。如果需要,我可以在以后对此问题的编辑中显示代码。

我正在 phone 和平板电脑上测试这个精简版应用程序。我安装应用程序,启动它,看到第一个片段显示的列表,然后退出。通过 DDMS,我引发了一次 GC,然后执行堆转储并在 Eclipse 内存分析器中检查它。对于 phone 和平板电脑,我都看到 "potential" 内存泄漏。

我的测试 phone,它使用 cynogenmod ROM,有一个性能设置选项 "Allow Purging of Assets"(参见 http://pocketnow.com/2012/12/10/5-nexus-4-speed-tips#toc-5)。当我启用此功能时,我潜在的内存泄漏就会消失。这让我觉得我的应用程序毕竟没有问题,但它的一些系统行为我不明白。

一些问题:

  1. 这可能是我的应用程序内存泄漏吗?
  2. 如果我的测试应用程序没有使用位图或可绘制对象,为什么要为位图分配内存?我可以检查什么?
  3. 关于解释 Eclipse 内存分析器报告的哪些潜在内存泄漏可以忽略,您有什么智慧的话吗?

提前致谢。我来自嵌入式实时 C 背景,所以当我看到内存泄漏时非常紧张!

所有视图都生成自己的位图缓存。这很可能是内存泄漏。它似乎在视图上 频繁更改布局 时发生。您可以尝试禁用缓存以查看它是否可以解决您的问题:

view.setDrawingCacheEnabled(false);

这个位图是系统相关的,不是应用内存泄漏。我通过 posts Android EdgeEffect appears to allocate a 1 meg bitmap and Strange Bitmap using 1 Mb of Heap.

得出了这个结论

对于阅读本文的任何人,我想提请您注意另一个非常有用的 post,它向我展示了如何查看 Eclipse 内存分析器工具指向的位图。这确实有助于调试。参见 MAT (Eclipse Memory Analyzer) - how to view bitmaps from memory dump