我需要检查我的应用程序是否存在内存泄漏,还需要查看应用程序的内存分配情况。 我下载并安装了Eclipse Memory Analyzer,第一步似乎是打开堆转储。 但是什么是堆转储?我该如何创建堆转储? 以及我该如何使用这个软件,我做了一些谷歌搜索,但没有找到有用的信息。 谢谢
我需要检查我的应用程序是否存在内存泄漏,还需要查看应用程序的内存分配情况。 我下载并安装了Eclipse Memory Analyzer,第一步似乎是打开堆转储。 但是什么是堆转储?我该如何创建堆转储? 以及我该如何使用这个软件,我做了一些谷歌搜索,但没有找到有用的信息。 谢谢
当您调试应用程序时,在Eclipse中打开DDMS。在工具栏上有一个堆转储按钮,您可以使用它生成一个堆转储以在Eclipse内存分析器中查看。我认为只有1.6+或2.0+ SDK支持此功能。
需要使用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()
查看已使用的本机堆(例如由应用程序中的位图使用的堆)。
同时请参阅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