使用 Eclipse 内存分析器查找内存泄漏

Posted

技术标签:

【中文标题】使用 Eclipse 内存分析器查找内存泄漏【英文标题】:Find memory leak using Eclipse memory analyzer 【发布时间】:2013-08-07 14:07:37 【问题描述】:

我正在使用一个存在内存泄漏的应用程序,一段时间后该用户使用它。我可以在 DDMS 中使用heap Tab 通过查看堆大小和分配来检查。

在应用程序中,用户始终可以使用设备相机拍摄图像,在图像上绘图,并将其保存在系统中。

用户在系统中创建的每条记录分配的内存都会增加一点,并且在特定数量的记录之后发生内存泄漏。

我在 DDMS 中导出 .hprof,并将其从 android sdk 转换为 eclipse memory analyzer 文件 unisg hprof-conv。 我按照几个链接查看问题出在哪里,例如:

Google I/O 2011: Memory management for Android Apps.

10 Tips for using the Eclipse Memory Analyzer.

我仍然找不到问题的根源。这是 SkyDrive 中的 Mat.hprof 文件:https://skydrive.live.com/#cid=2EB3385F103C2550&id=2EB3385F103C2550%21105

谁能看看这个文件并给我一些提示,问题出在哪里?或者有什么改进建议?

【问题讨论】:

【参考方案1】:

您是否尝试比较 MAT 中的 2 个 hprof 文件?

直方图视图中有一个“与另一个堆转储比较”选项。它将向您显示 2 个 hprof 文件之间的区别,然后更容易找出您的内存泄漏

【讨论】:

【参考方案2】:

很简单:

-打开你的转储,然后使用支配树:

您可以看到堆栈中保留了 2 个大对象,一个来自资源,一个来自位图。 - 使用右键在位图上显示gc的最短路径:

在那里,您可以看到答案。在您的应用程序中,您的 res 文件夹中可能包含一个大图像。 问题是当您直接在布局中使用此图像时,这可能会导致内存不足错误。您需要使用本教程以编程方式加载位图以避免内存泄漏:

http://developer.android.com/training/displaying-bitmaps/index.html

【讨论】:

【参考方案3】:

在 MAT 中加载您的 .hprof 文件后,我看到您的应用程序创建了许多包含嵌套集合的数组,其中发生了 OutOfMemoryError。那么是什么原因呢?要在 AutoCompleteTextView 中取回结果,您正在使用可能导致内存泄漏的处理程序,它最终可以对当前视图和您的 Activity 保持强大的引用。在生命周期事件发生时,应及时关注集合发布过程。

【讨论】:

以上是关于使用 Eclipse 内存分析器查找内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

使用MAT分析JVM内存溢出

Eclipse MAT 安装及使用

如何排查Java内存泄露

android 中如何分析内存泄漏

Android 中如何分析内存泄漏

使用Eclipse Memory Analyzer进行内存泄漏分析三部曲