dalvik的垃圾收集工具

pri*_*kar 6 android garbage-collection dalvik

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

tal*_*kol 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
Run Code Online (Sandbox Code Playgroud)

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

该行包含许多有关 GC 的有趣统计信息,例如释放的内存量、GC 花费的时间、确切发生的时间以及堆的大小(已使用/总计)。

由于所有这些日志行都有 tag dalvikvm,您应该能够在很长一段时间内收集和过滤它们并进行分析以了解 GC 行为。

分析GC的具体运行:

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

Eclipse MAT 可以显示两个快照之间的差异。请注意,您将看到新的分配和 GC 引起的释放。有关比较快照的更多信息,请参见此处

其他一些想法:

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

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