如何分析Dalvik GC的行为?

时间:2010-12-27 11:28:06

标签: java android memory-management dalvik heap-dump

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

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

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

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

(*)我尝试了jcatEclipse MAT。我无法让hat处理Android堆转储;它抱怨转储文件版本不受支持。

2 个答案:

答案 0 :(得分:4)

  

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

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

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

步骤3:选择您的模拟器,然后单击Allocation Tracker选项卡

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

步骤4:单击按钮,当传感器处理过程完成后,单击DDMS Allocation Tracker选项卡上的Get Allocations。

这将告诉您在该部分代码中分配的内容。它没有告诉你什么是“释放”,因为在GC循环运行之前它是不确定的。

修改

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

而且,FWIW,here is a short technical article关于DDMS和分配跟踪。

答案 1 :(得分:1)

我认为您需要尝试分配跟踪器:)

(在/ tools目录中)

http://developer.android.com/resources/articles/track-mem.html