【问题标题】:"Live" memory analysis tool for AndroidAndroid的“实时”内存分析工具
【发布时间】:2011-09-22 22:42:29
【问题描述】:

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

注意:我不是在寻找适用于 Android 的内存分析工具(Memory Analyzer Tools 非常适合我)。我遇到的所有方法/工具,都会对堆进行快照并将其保存到文件中。我正在寻找一种工具,它可以提供实时计数器/更新各种对象正在使用的堆的哪些部分,并且这是在秒/亚秒的基础上更新的。 Android 可能无法做到这一点。但是,无论如何,我都没有找到明确的答案。

【问题讨论】:

标签: android memory-management profiling


【解决方案1】:

观看此视频 here 大约 35 分钟,他们展示了如何分析您的应用,但不确定您是否可以“实时”完成。


更多信息from this post on milk.com:

自 android 1.6 以来从未尝试过此操作,不确定是否可以实时执行,但您曾经能够通过以下方式生成堆数据:

在设备上获取命令外壳:

$ 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 退出设备命令 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。

【讨论】:

  • 他们演示了内存分析工具(我已经在我的帖子中提到过)。此工具拍摄当前堆使用情况的快照。我正在寻找能够在我使用应用程序时提供堆运行视图的东西。
  • 已编辑答案以显示我过去是如何获取堆数据的 - 自 android 1.6 以来还没有这样做过,不确定它是否对你有用但可能会有所帮助!
  • 感谢您的详细评论,但就像我在之前的评论中提到的那样,我不希望获得当前堆分配的静态快照。我正在寻找一个动态的“实时”视图,该视图在应用程序使用时不断更新。也许这是不可能的,但我想确定一下。
  • 我知道您正在寻找“实时”分析,但我知道没有任何工具可以做到这一点,您可以尝试获取堆的持续快照,但获取数据可能需要几秒钟所以不会像这样“活着”。您可能必须编写自己的工具才能做到这一点。
  • 我想这可能是唯一的方法。用于 iOS 开发的 XCode 工具可以很好地做到这一点,我发现每当我在应用程序中执行操作时,注意分配和释放是如何发生的非常有用。还是谢谢你。
猜你喜欢
  • 1970-01-01
  • 2011-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-01
  • 2012-07-15
  • 2014-01-21
  • 1970-01-01
相关资源
最近更新 更多