Java GarbageCollectorMXBean完整GC收集计数和收集时间

Java GarbageCollectorMXBean完整GC收集计数和收集时间,java,garbage-collection,visualvm,Java,Garbage Collection,Visualvm,我使用GarbageCollectorMXBean获取JVM完整GC CollectionCount 收集时间。但数据并不等于 由jstat收集,但VisualVM的数据与jstat相同 所以,我查看了VisualVM源代码来研究它是如何工作的,并且已经看到了这一点 VisualVM还通过GarbageCollectorMXBean收集JVM完整GC 数据 为什么? 我为java应用程序添加了gc日志JVM参数的部分是-XX:+PrintGCDetails-verbose:gc-Xloggc:/

我使用GarbageCollectorMXBean获取JVM完整GC CollectionCount 收集时间。但数据并不等于 由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显示的数据。这是否意味着jstatfullgc不仅仅是fullgc

visualVm vs jstat visualVm完整gc为4 jstat也是完整的gc 4

jconsole vs jstat jconsole完全gc为2 jstatfullgc是4

那么为什么不平等呢

gc日志与jstat gc日志已满gc为2 jstatfullgc是4


很抱歉我的英语很差,希望你能理解我的意思:

看起来你在比较代表不同事物的数据

首先,GarbageCollectorMXBean.getCollectionCount返回给定GC已发生的集合总数。这意味着您将获得年轻GC和旧GC的总数,而不一定是完整GC的数量。尤其是当你使用CMS的时候

您正在刷新CMS初始标记,这肯定不是完整的GC。在您的情况下,完整GC将是对System.GC的调用、ParNew升级失败或并发模式失败。否则,您只需查看CMS周期的数量


最后,我认为VisualVM使用SA代理获取更多信息,而JConsole只使用MX bean。因此,您不会得到相同的数据。

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

首先,GarbageCollectorMXBean.getCollectionCount返回给定GC已发生的集合总数。这意味着您将获得年轻GC和旧GC的总数,而不一定是完整GC的数量。尤其是当你使用CMS的时候

您正在刷新CMS初始标记,这肯定不是完整的GC。在您的情况下,完整GC将是对System.GC的调用、ParNew升级失败或并发模式失败。否则,您只需查看CMS周期的数量


最后,我认为VisualVM使用SA代理获取更多信息,而JConsole只使用MX bean。因此,您不会得到相同的数据。

我找到了相同的描述,并认为这最终无关紧要,但这很奇怪。GarbageCollectorMXBean.getCollectionCount的javadoc表示它返回已发生的收集总数。并没有提到完整的,只有这样才会返回其他,非完整的集合了。这能解释差异吗?@DISC3是的,但每个gc名称都有GarbageCollectorMXBean。因此GarbageCollectorMXBean只返回代表性的gc名称是已发生的集合总数,而不是已发生的集合总数。VisualGc是VisualVM的插件,VisualGC的源代码在哪里。我发现了相同的描述,并认为它最终无关紧要,但很奇怪。GarbageCollectorMXBean.getCollectionCount的javadoc表示它返回已发生的集合总数。并没有提到完整的,只有这样才会返回其他,非完整的集合了。这能解释差异吗?@DISC3是的,但每个gc名称都有GarbageCollectorMXBean。因此GarbageCollectorMXBean只返回代表性的gc名称是已发生的集合总数,而不是已发生的集合总数。VisualGc是VisualVM的插件,VisualGC的源代码在哪里?在什么时间段内发生的集合总数?是从JVM启动后开始的吗?在什么时间段内发生的集合总数?是从JVM启动以来的吗?