我正在使用一个内存泄漏的应用程序,过了一段时间用户使用它。我可以通过查看堆大小和分配来使用heap
Tab在DDMS中检查它。
在应用程序中,用户始终可以使用设备Camera拍摄图像,在图像上绘图,然后将其保存在系统中。
根据用户在系统中创建的每条记录,分配的内存会增加一点,并且在特定数量的记录发生内存泄漏之后。
我在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
有人可以查看这个文件并给我一些提示,问题来自哪里?或任何改进建议?
答案 0 :(得分:0)
您是否尝试在MAT中比较2个hprof文件?
直方图视图中有一个选项“与另一个堆转储比较”。它将向您显示2 hprof文件之间的区别,然后更容易找到您的内存泄漏
答案 1 :(得分:0)
很简单:
- 打开转储,然后使用支配树:
你可以看到堆栈中保留了2个大对象,一个来自Resources,还有一个Bitmap。 - 使用右键单击以显示位图上gc的最短路径:
在那里,你可以看到答案。在您的应用中,您的res文件夹中可能包含一个大图像。 问题是当您在布局中直接使用此图像时,这可能会导致内存不足错误。您需要使用本教程以编程方式加载位图以避免内存泄漏:
http://developer.android.com/training/displaying-bitmaps/index.html
答案 2 :(得分:0)
在MAT中加载.hprof文件之后,我看到你的应用程序创建了很多带有嵌套集合的数组,其中发生了OutOfMemoryError。那是什么原因?要在AutoCompleteTextView中获取结果,您使用的Handler可能会导致内存泄漏,它可以最终对当前视图和您的Activity保持强大的参考。在生命周期事件发生时,您应该更加关注集合发布过程。