2012-06-18 60 views
2

我使用GarbageCollectorMXBean來獲取JVM Full GC CollectionCount 和CollectionTime。但是數據與jstat收集的數據( )不相等(但VisualVM的數據與jstat相同)。GarbageCollectorMXBean Full GC CollectionCount和CollectionTime

所以,我檢查了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不僅是完整的gc?

VisualVM的VS jstat
VisualVM的全gc爲4
jstat是完整的GC也4

enter image description here

JConsole的VS jstat
JConsole的全gc爲2
jstat完整的GC是4

enter image description here

爲什麼然後不相等?

GC日誌VS jstat
GC日誌滿gc爲2
jstat完整的GC是4 enter image description here

我爲我的英文不好對不起,希望你能明白我的意思:)

+2

我發現了同樣的缺點,並最終決定它並不重要,但它很好奇。 –

+0

GarbageCollectorMXBean.getCollectionCount的javadoc表示它返回「返回發生的集合總數」。並沒有提到完整的(所以也會返回其他非全集合)。這會解釋差異嗎? –

+0

@ Disco3是的,但每個gc名稱都有GarbageCollectorMXBean.so GarbageCollectorMXBean僅返回代表gc name是已發生的集合總數,而不是發生的總數集合。 – fuyou001

回答

0

看起來你正在比較代表不同事物的數據。

首先,GarbageCollectorMXBean.getCollectionCount返回給定GC的「發生的集合總數」。這意味着您將獲得Young GC和Old GC的總數,不一定是Full GC的數量。特別是如果你使用CMS。

您正在繪製CMS-initial-mark,這絕對不是完整的GC。您的案例中的完整GC將是對System.gc()的調用,ParNew Promotion失敗或併發模式失敗。否則,您只需查看CMS週期數。

最後,我認爲VisualVM使用SA代理來獲取更多信息,而JConsole只使用MX Beans。所以你不會得到相同的數據。