5

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

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

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

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

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

4

2 回答 2

4

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

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

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

步骤#3:选择你的模拟器,然后点击 Allocation Tracker 选项卡

第 4 步:让您的应用程序等待第 1 步中的按钮单击,然后单击 DDMS Allocation Tracker 选项卡中的 Start Tracking。

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

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

编辑

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

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

于 2010-12-27T12:37:43.807 回答
1

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

(在您的 /tools 目录中)

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

于 2010-12-27T12:39:38.527 回答