我正在Android上开发一个应用程序。它是一个长期运行的应用程序,可持续处理传感器数据在运行应用程序时,我在logcat中看到了很多GC消息;大约一秒钟。
这很可能是因为正在创建对象并在循环中立即取消引用。
如何找到立即创建和发布的对象?
我尝试过的所有java堆分析工具(*)都对堆上对象的数量和大小感到困扰。虽然它们很有用,但我更感兴趣的是找到 temporary 短期对象创建最多的网站。
(*)我尝试了jcat
和Eclipse MAT
。我无法让hat
处理Android堆转储;它抱怨转储文件版本不受支持。
答案 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)