繁体   English   中英

如何分析Dalvik GC的行为?

[英]How to analyse Dalvik GC behaviour?

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

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

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

我尝试过的所有Java堆分析工具(*)都被堆上对象的数量和大小所困扰。 尽管它们很有用,但我更感兴趣的是找出创建 临时 短暂对象最多的站点。

(*)我尝试了jcatEclipse MAT 我不能让hat在Android堆转储工作; 它抱怨不支持的转储文件版本。

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

步骤#1:临时修改代码(或使用代码的相关部分创建剪贴项目),您可以在其中单击按钮或执行某种操作,以完全通过传感器处理逻辑运行一次。

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

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

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

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

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

编辑

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

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

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

(在您的/ tools目录中)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM