6

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

4

1 回答 1

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 引起的释放。有关比较快照的更多信息,请参见此处

其他一些想法:

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

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

于 2013-08-08T14:48:35.377 回答