如何分析Dalvik GC的行为?

HRJ*_*HRJ 5 java android memory-management dalvik heap-dump

我正在Android上开发一个应用程序.它是一个长期运行的应用程序,可持续处理传感器数据 在运行应用程序时,我在logcat中看到了很多GC消息; 大约一秒钟.

这很可能是因为正在创建对象并在循环中立即取消引用.

如何找到立即创建和发布的对象?

我尝试过的所有java堆分析工具(*)都对堆上对象的数量和大小感到困扰.虽然它们很有用,但我更感兴趣的是找到创建临时短寿命对象的网站.

(*)我想jcatEclipse MAT.我无法开始hat使用Android堆转储; 它抱怨不支持的转储文件版本.

Com*_*are 4

如何找到正在立即创建和释放的对象?

步骤#1:暂时修改您的代码(或使用代码的相关部分创建一个废弃项目),您可以在其中单击按钮或其他内容以通过传感器处理逻辑运行一次。

步骤#2:进入 DDMS(独立或 Eclipse 透视图)。

步骤#3:选择您的模拟器,然后单击“分配跟踪器”选项卡

步骤#4:让您的应用程序等待步骤#1 中单击按钮,然后单击“DDMS 分配跟踪器”选项卡中的“开始跟踪”。

步骤 #4:单击 按钮,传感器处理过程完成后,单击 DDMS 分配跟踪器选项卡上的获取分配。

这将告诉您在代码的该部分期间分配了什么。它不会告诉您什么是“释放”的,因为在 GC 周期运行之前这是不确定的。

编辑

我不确定,但startAllocCounting()android.os.Debug类上可能与单击“开始跟踪”按钮具有相同的效果。如果是这样,您可以简单地检测代码来跟踪循环的一次分配,而不是搞乱我上面概述的代码更改。

而且,FWIW,这是一篇关于 DDMS 和分配跟踪的简短技术文章