安卓 ==> 内存分析 ==> Eclipse内存分析器?

46

我需要检查我的应用程序是否存在内存泄漏,还需要查看应用程序的内存分配情况。 我下载并安装了Eclipse Memory Analyzer,第一步似乎是打开堆转储。 但是什么是堆转储?我该如何创建堆转储? 以及我该如何使用这个软件,我做了一些谷歌搜索,但没有找到有用的信息。 谢谢


3
只是提供信息,涉及到主题- Android 博客上有一篇新的关于内存分析的博客文章:http://android-developers.blogspot.com/2011/03/memory-analysis-for-android.html - Mathias Conradt
3个回答

40

当您调试应用程序时,在Eclipse中打开DDMS。在工具栏上有一个堆转储按钮,您可以使用它生成一个堆转储以在Eclipse内存分析器中查看。我认为只有1.6+或2.0+ SDK支持此功能。


好的,我点击了“dump”,然后它打开了一个名为“android123123123”的新窗口,里面有很多奇怪的字符。 我该怎么处理这个页面? 文件在哪里? 再次感谢。 - aryaxt
2
我自己解决了。 文件 ==> 另存为,然后在内存分析器中打开该文件。 - aryaxt
6
你漏掉了Mathias答案中提到的一个关键步骤:“需要使用Android SDK工具目录中的hprof-conv.exe转换器工具将dalvik VM的堆转换为常规hprof格式。” - Jeff Axelrod

10

需要使用Android SDK工具目录中的hprof-conv.exe转换器将dalvik VM的堆转换为常规的hprof格式堆转储文件。 您可以使用Eclipse MAT或其他工具打开此hprof,例如: YourKit http://www.yourkit.com/ 和JProbe http://www.quest.com/jprobe/

除了DDMS之外,您还可以通过Debug.dumpHprofData(...)从应用程序/代码(仅适用于较新的SDK)创建hprof文件。

请注意,在DDMS中,您可以看到应用程序正在使用的堆。它不会显示外部资源(例如位图)分配的本机堆。尽管如此,当检查内存泄漏时,这些资源也需要考虑在内。当本机堆和应用堆总计达到16MB / resp. 24MB时,您将收到OOM错误。

您可以通过Debug.getNativHeapAllocatedSize()查看已使用的本机堆(例如由应用程序中的位图使用的堆)。


1
@MathiasLin,有没有办法分析/查看本地堆中的对象? - snapfractalpop
@snapfractalpop 抱歉,我不知道,我自己还没有寻找过这样的东西。 - Mathias Conradt
@snapfractalpop 你有找到一种分析本地内存中对象的方法吗? - Harshal Kshatriya
(独立)DDMS有一个“本地堆”选项卡来分析它; <android-sdk>/tools/ddms - Mathias Conradt
如果您使用的是Eclipse版本的MAT,则无需再转换堆转储文件。 - Daniel Ryan
显示剩余3条评论

3

同时请参阅http://developer.android.com/guide/developing/debugging/ddms.html#profiling

如果需要,您可以使用Debug API在本地代码区域启用分析。这样,在例如traceview中分析跟踪时,您的记录信息就会更简洁。请参考http://macgyverdev.blogspot.com/2011/07/profiling-android-application-tutorial.html获取更多示例。

此外,还有一些更详细的信息,介绍如何将DDMS堆转储转换为Eclipse Memory Analyzer中的视图,并通过主导树工具查找泄漏对象:http://macgyverdev.blogspot.com/2011/11/android-track-down-memory-leaks.html


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