我正在 Android 上开发应用程序。它是一个持续处理传感器数据的长期运行的应用程序。在运行应用程序时,我在 logcat 中看到很多 GC 消息;大约每秒一个。
这很可能是因为对象在循环中被创建并立即取消引用。
如何找到正在创建和立即释放的对象?
我尝试过的所有 Java 堆分析工具 (*) 都对堆上对象的数量和大小感到困扰。虽然它们很有用,但我更感兴趣的是找出创建最多 temporary 短期对象的站点。
(*) 我尝试了 jcat
和 Eclipse MAT
。我无法得到 hat
来处理 Android 堆转储;它提示转储文件版本不受支持。
最佳答案
How do I find which objects are being created and released immediately?
第 1 步:临时修改您的代码(或使用代码的相关部分创建一个废弃项目),您可以在其中单击一个按钮或其他东西以通过传感器处理逻辑运行一次。
第 2 步:进入 DDMS(独立或 Eclipse 透视图)。
第 3 步:选择您的模拟器,然后单击“分配跟踪器”选项卡
第 4 步:让您的应用程序等待第 1 步中的按钮点击,然后在 DDMS Allocation Tracker 选项卡中点击 Start Tracking。
第 4 步:单击按钮,当传感器处理过程完成后,单击 DDMS 分配跟踪器选项卡上的获取分配。
这将告诉您在该部分代码中分配了什么。它不会告诉您“已释放”的内容是什么,因为在 GC 循环运行之前这是不确定的。
编辑
我不确定,但是 android.os.Debug
类上的 startAllocCounting()
可能与单击 Start Tracking 按钮具有相同的效果。如果是这样,您可以简单地检测您的代码以跟踪一次循环中的分配情况,而不是乱搞我上面概述的代码更改。
并且,FWIW,here is a short technical article关于 DDMS 和分配跟踪。
关于java - 如何分析 Dalvik GC 行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4538362/