看看这个视频here http://youtu.be/Oq05KqjXTvs在大约 35 分钟的时间里,他们展示了如何分析您的应用程序,但不确定您是否可以“实时”进行分析。
更多信息来自 milk.com 上的这篇文章 http://milk.com/kodebase/dalvik-docs-mirror/docs/heap-profiling.html:
自 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 日志消息才能知道它何时完成。
Next:
# ls /data/misc/heap-dump*
# exit
使用 ls 检查文件名,然后 exit 退出设备命令 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 格式的基础上略有增强,并且由于许可限制,修改后的 hat 工具无法分发。转换工具 hprof-conv 可用于从输出中去除 Android 特定部分。该工具首次包含在 1.5 中,但适用于旧版本的 Android。
转换后的输出应该适用于任何 hprof 数据分析器,包括 jhat(Sun JDK 中免费提供)和 Eclipse MAT。