1

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

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

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

我在 DDMS 中导出 .hprof,并将其转换为来自 Android sdk 的eclipse 内存分析器文件 unisg hprof-conv。我按照几个链接查看问题来自哪里,例如:

Google I/O 2011:Android 应用程序的内存管理

使用 Eclipse 内存分析器的 10 个技巧

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

谁能看一下这个文件并给我一些提示,问题出在哪里?或任何改进建议?

4

3 回答 3

0

这很简单 :

- 打开你的转储,然后使用支配树: 在此处输入图像描述

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

在此处输入图像描述

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

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

于 2013-08-07T14:39:36.353 回答
0

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

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

于 2013-08-07T14:17:45.077 回答
0

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

于 2016-01-20T15:27:19.903 回答