dalvik的垃圾收集工具

时间:2011-06-21 23:11:21

标签: android garbage-collection dalvik

我正在检测Dalvik VM并想知道是否有任何工具来分析dalvik中的垃圾收集。我知道分配跟踪器,但我正在寻找更精细的东西。

1 个答案:

答案 0 :(得分:0)

获取所有GC操作的日志:

每次进行GC时,您都会在LogCat中找到一行。

08-08 16:42:21.998: D/dalvikvm(26942): GC_CONCURRENT freed 773K, 26% free 4739K/6368K, paused 4ms+3ms, total 92ms
08-08 16:42:21.998: D/dalvikvm(26942): WAIT_FOR_CONCURRENT_GC blocked 11ms

似乎我正在为我的设备上的所有应用程序获取这些内容。

这一行包含许多关于GC的有趣统计数据,例如释放的内存量,GC的使用时间,确切时间以及堆的大小(已使用/总计)。

由于所有这些日志行都有标记dalvikvm,因此您应该能够长时间收集和过滤它们并进行分析以了解GC行为。

分析GC的特定运行:

如果您想分析一个特定GC操作中发生的情况,那么该工作的最佳工具是Eclipse MAT。 Eclipse MAT可以解析堆转储。获取堆快照,等待GC(或使用DDMS自行触发),然后拍摄另一张快照。

Eclipse MAT可以显示两个快照之间的增量。请注意,您将看到新的分配和GC导致的解除分配。有关比较快照的更多信息是available here

其他一些想法:

我不确定你能从分析GC过程中学到多少东西。 GC的内部工作原理是一个实现细节。它可以在OS版本/设备/配置之间更改,恕不另行通知。

我正在考虑改善您遇到的GC延迟的方法。在我看来,GC通常在内存条件较低时运行。这可能发生在新分配期间,因此GC可能在您的服务处于活动状态时运行。也许,如果您手动使用服务对GC不活动的时间,您将能够减少响应Web请求的关键路径中发生的GC数量。为了尝试这个,我会添加一个简单的后台计时器,并在我的服务变为活动时重置它(新请求)。当计时器滴答(一段时间不活动)时,我会手动运行System.gc()