适用于Android的“实时”内存分析工具

时间:2011-06-26 11:49:47

标签: android memory-management profiling

Android是否有“实时”内存分析器工具(类似于XCode中的Instruments)?大多数内存分析搜索引导我使用Memory Analyzer Tool(这很棒),但我非常感谢一个可以动态显示哪些类在我的应用程序的生命周期中消耗(和释放)内存的工具,因为它正在执行。

注意:我正在寻找适用于Android的内存分析工具(Memory Analyzer Tools对我来说效果非常好)。我遇到的所有方法/工具都会获取堆的快照并将其保存到文件中。我正在寻找一个工具,它提供一个实时计数器/更新各种对象正在使用的堆的哪个部分,并在二秒/亚秒的基础上更新。 Android可能无法实现这一点。但是,我还没有找到一个明确的答案。

1 个答案:

答案 0 :(得分:1)

在35分钟左右看一下这段视频here,他们会展示如何分析您的应用,不确定您是否可以“现场”进行。


更多信息from this post on milk.com

自从Android 1.6以来没有尝试过这个并且不确定你是否能够实现它,但你曾经能够通过以下方式生成堆数据:

在设备上获取命令shell:

$ adb shell

您可以使用id命令验证您是否以root用户身份运行。响应应该看起来像uid = 0(root)gid = 0(root)。如果没有,请键入su并再试一次。如果su失败了,那你就不走运了。

接下来,确保目标目录存在:

# mkdir /data/misc
# chmod 777 /data/misc

使用ps或DDMS确定应用程序的进程ID,然后将SIGUSR1发送到目标进程:

# kill -10 <pid>

信号导致GC,然后是堆转储(完全准确,它们实际上是同时发生的,但堆转储中的结果反映了GC后状态)。这可能需要几秒钟,因此您必须注意GC日志消息才能知道它何时完成。

下一步:

# ls /data/misc/heap-dump*
# exit

使用ls检查文件名,然后退出以退出设备命令shell。

您应该看到两个输出文件,名为/data/misc/heap-dump-BLAH-BLAH.hprof和.hprof-head,其中BLAH是运行时生成的值,用于确保文件名是唯一的。将它们从设备中拉出并移除设备端副本:

$ adb pull /data/misc/heap-dump-BLAH-BLAH.hprof tail.hprof
$ adb pull /data/misc/heap-dump-BLAH-BLAH.hprof-head head.hprof
$ adb shell rm /data/misc/heap-dump-BLAH-BLAH.hprof /data/misc/heap-dump-BLAH-BLAH.hprof-head

将它们合并在一起并去除中间体:

$ cat head.hprof tail.hprof > dump.hprof
$ rm head.hprof tail.hprof

您现在在dump.hprof中有hprof转储。

数据文件格式从常见的hprof格式略微增加,并且由于许可限制,无法分发修改后的帽子工具。转换工具hprof-conv可用于从输出中剥离特定于Android的部分。此工具最初包含在1.5中,但可以与旧版Android一起使用。

转换后的输出应该适用于任何hprof数据分析器,包括可在Sun JDK中免费获得的jhat和Eclipse MAT。