2012-06-18 1 views
2

Я использовал GarbageCollectorMXBean, чтобы получить JVM Full GC CollectionCount и CollectionTime. Но данные не равны данным, которые составляют , собранные jstat (но данные VisualVM равны jstat).GarbageCollectorMXBean Полная коллекция GCCount и CollectionTime

Итак, я проверяю VisualVM исходный код, чтобы изучить, как это работает, и увидели, что VisualVM также работает через GarbageCollectorMXBean, чтобы собрать полную JVM GC данных. Почему?

Я добавляю gc log для java-приложения (части JVM-параметра: -XX: + PrintGCDTails -verbose: GC -Xloggc: /home/yubaofu/work/debug/gc.log). Я прочитал журнал gc и увидел, что полный gc CollectionCount не равен данным, отображаемым jstat. Означает ли это, что jstat full gc не только полный gc?

VisualVM против jstat
VisualVM полный дс является 4
jstat полна дс также 4

enter image description here

JConsole против jstat
JConsole полный дс 2
jstat полный дс составляет 4

enter image description here

Почему тогда не равно?

дс журнал против jstat
дс журнал полный дс 2
jstat полный дс является 4 enter image description here

Я извиняюсь за мой бедный английский, надеюсь, вы понимаете, что я имею в виду :)

+2

Я нашел то же descrepancy и решил, что это не имеет значения, в конце концов, но это любопытно. –

+0

В javadoc для GarbageCollectorMXBean.getCollectionCount указано, что он возвращает «Возвращает общее количество созданных коллекций». и не упоминает только полный (так что возвратит другие, неполные коллекции тоже). Объяснит ли это различие? –

+0

@ Disco3 да, но каждое имя gc имеет GarbageCollectorMXBean.so GarbageCollectorMXBean возвращает только имя представителя gc - общее количество собраний, которые произошли, а не общее количество коллекций номеров, которые произошли. – 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. Таким образом, вы не получите одинаковые данные.