安卓系统的“实时”内存分析工具

3
有没有类似于XCode中的Instruments的“实时”内存分析工具可用于Android?大多数搜索结果都指向了内存分析器工具(非常好用),但我非常希望有一个工具可以在应用程序生命周期中动态地显示哪些类占用(和释放)了内存,因为它正在执行。
注意:我不是在寻找Android的内存分析工具(Memory Analyzer Tools已经非常适合我了)。我遇到的所有方法/工具都会对堆进行快照并将其保存到文件中。我正在寻找一种工具,该工具提供有关各种对象使用的堆部分的实时计数器/更新,并且这些内容每秒/亚秒更新一次。这可能在Android上不可能实现。但是,我还没有找到明确的答案。

1
DDMS提供了堆和分配跟踪器 - 这些以及MAT基本上是我能找到的所有内容。如果您找到比这更好的内容,请更新您的帖子。 - Asahi
请查看我在 https://dev59.com/RGHVa4cB1Zd3GeqPkCy3#9679360 的回答。 - Tofeeq Ahmad
1个回答

1

看一下这个视频这里,在大约35分钟的时候他们展示了如何对你的应用进行性能分析,不确定是否可以实时进行。


更多信息请参考 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命令检查文件名,然后使用exit命令退出设备命令行。

您应该会看到两个输出文件,分别命名为/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数据分析器一起使用,包括Sun JDK中免费提供的jhat和Eclipse MAT。


他们演示了内存分析工具(我在我的帖子中已经提到过)。该工具会对当前堆使用情况进行快照。我正在寻找一种可以在我使用应用程序时给我堆的运行视图的工具。 - sparkymat
编辑了回答以展示我过去获取堆数据的方法 - 自从Android 1.6以来就没有使用过它,也不确定它对你是否有用,但可能会有所帮助! - Kenny
谢谢您的详细评论,但正如我在之前的评论中提到的那样,我不是想获取当前堆分配的静态快照。我正在寻找一个动态的“实时”视图,该视图在应用程序使用过程中不断更新。也许这是不可能的,但我想确认一下。 - sparkymat
1
我知道你正在寻找“实时”分析工具,但我不知道有任何可以做到这一点的工具。你可以尝试获取堆的常量快照,但是获取数据可能需要几秒钟,因此不能算是真正的“实时”。你可能需要编写自己的工具来完成这项任务。 - Kenny
我想这可能是唯一的方法。XCode工具用于iOS开发可以很好地完成这项任务,我发现每当我在应用程序中执行操作时,记录分配和释放的方式非常有用。无论如何,谢谢你。 - sparkymat

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