2011-01-08 99 views
7

我想監視JMX中的完整GC頻率。 MBean暴露GC計數。 (參考http://download.oracle.com/javase/1.5.0/docs/api/java/lang/management/GarbageCollectorMXBean.html - java.lang:type = GarbageCollector,name =)。是否可以在JMX(HotSpot)上監控「Full GC」頻率?

問題是MBean並未區分次要和完全gc。

有人有想法嗎?

謝謝。

Arnault

+1

您可能會發現gc之前/之後的舊版使用情況只會在完整gc時下降。如果這是你的情況,那麼這將足以識別完整的GC。 – Ron 2011-02-02 16:42:31

+0

[這可能會給你一些見解](https://gist.github.com/khotyn/1520947)在你測試你的代碼的JVM上啓用了哪種GC類型 – KJ50 2014-08-25 23:37:06

回答

0

它確實...看起來像名稱ParNew,ConcurrentMarkSweep,..等 一些名稱是爲小gc,一些爲全gc,

+0

對不起,但不完全。 ParNew和ConcurrentMarkSweep是GC算法的實現,對於那些GC你可以有小的或主要的集合。 – ajeanson 2011-01-21 06:54:07

8

我不完全確定這一點,但我認爲,控制所有內存池的垃圾回收器(至少一個用於老一代)是用於主要gc的一個。例如:我有JVM與這些2個收集器運行:

  • PS MarkSweep
    • MemoryPoolNames:PS伊甸空間,PS倖存者空間,PS舊根,PS彼爾姆根
    • CollectionCount:68
  • PS掃氣
    • MemoryPoolNames:PS伊甸園空間,PS生存空間
    • CollectionCount:2690

考慮到這一點,我會說,PS掃氣用於較小的GC和PS MarkSweep重大GC。

UPDATE(基於@ajeanson評論,感謝您的反饋BTW):

實際上,我擺在那裏的例子來自於我所用的JVM的MXBean的公開的信息中取得。如您所述,這些是GC算法,GC的MXBean所使用的名稱是基於GC正在使用的算法。我一直在尋找更多關於這方面的信息;本文http://download.oracle.com/javase/6/docs/technotes/guides/management/jconsole.html中,讀取以下:

雖然Java HotSpot VM定義了兩個 一代:年輕一代 (有時稱爲「託兒所」)和 老一代。年輕的 一代包括一個「伊甸園空間」 和兩個「倖存者空間」。 VM 最初將所有對象分配給Eden空間,並且大多數對象在那裏死亡 。當它執行次要GC時,VM將任何剩餘的對象 從Eden空間移動到 倖存空間之一。虛擬機移動對象 ,該對象在活着的 空間中足夠長的時間移動到 老一代的「終身」空間。當終身 代填滿時,有一個完整的GC,通常要慢得多,因爲它涉及所有活動對象。 永久代持有虛擬機 本身的所有反射數據,如類和方法 對象。

考慮看看上的MXBean的collectionCount財產,在我的「PS MarkSweep」收集器的情況下(在一個管理的老一代池),集數,似乎當我得到一個完整的GC只增加在詳細輸出中。我可能是錯的,也許在某些情況下,這個收集器也會執行較小的GC,但我需要運行更多的測試才能完全確定這一點。 請讓我知道是否有人發現了別的東西,或者您對這個問題有更多具體的信息,因爲我對它很感興趣。