2

我使用 GarbageCollectorMXBean 来获取 JVM Full GC CollectionCount 和 CollectionTime。但是数据与 jstat 收集的数据不相等(但 VisualVM 的数据与 jstat 相等)。

所以,我查看了 VisualVM 源代码来研究它是如何工作的,并且看到 VisualVM 也可以通过 GarbageCollectorMXBean 来收集 JVM 全 GC 数据。为什么?

我为 java 应用程序添加 gc 日志(部分 JVM 参数是 -XX:+PrintGCDetails -verbose:GC -Xloggc:/home/yubaofu/work/debug/gc.log)。我阅读了 gc 日志,发现完整的 gc CollectionCount 不等于 jstat 显示的数据。这是否意味着 jstat full gc 不仅仅是 full gc ?

visualVm vs jstat
visualVm full gc is 4
jstat is full gc also 4

在此处输入图像描述

jconsole vs jstat
jconsole full gc is 2
jstat full gc is 4

在此处输入图像描述

为什么不相等呢?

gc log vs jstat
gc log full gc is 2
jstat full gc is 4 在此处输入图像描述

我很抱歉我的英语不好,希望你能明白我的意思:)

4

1 回答 1

0

看起来您正在比较代表不同事物的数据。

首先,GarbageCollectorMXBean.getCollectionCount 返回给定 GC 的“已发生的收集总数”。这意味着你会得到 Young GC 和 Old GC 的总数,不一定是 Full GC 的数量。特别是如果您使用 CMS。

您正在寻找 CMS-initial-mark,这绝对不是 Full GC。在您的情况下,完整的 GC 将是调用System.gc()ParNew Promotion 失败或并发模式失败。否则,您只是在查看 CMS 周期的数量。

最后,我认为 VisualVM 使用 SA 代理来获取更多信息,而 JConsole 仅使用 MX Beans。所以你不会得到相同的数据。

于 2013-09-12T12:14:20.217 回答