2011-03-29 57 views
1

所以我一直在試圖找到一種很好的方法來監視JVM何時可能正朝着OOM的方向發展。他們似乎與我們的應用程序一起工作的最好方式是通過CMS跟蹤背靠背併發模式故障。這表明終端游泳池的填充速度比實際清理自己的速度要快,或者其回收量很少。有沒有通過JMX識別CMS併發模式故障的方法?

用於跟蹤GC的JMX bean具有非常通用的信息,例如之前/之後的內存使用情況等。這個信息充其量是相對不一致的。有沒有更好的方法可以監控死亡JVM的這種潛在警告信號?

+0

你想從虛擬機內做到這一點,或者很樂意使用一些外部腳本嗎?你正在使用哪個JMX bean?您使用哪種JVM(inc版本)? – Matt 2011-03-29 20:04:25

+0

它不一定會在同一個JVM中,但它可以是。我正在使用多個,但對於內存標準,我正在使用內存和CMS垃圾回收標準。我正在使用1.6。 – Zack 2011-03-31 19:48:07

回答

0

對於標準的JRE 1.6 GC,根據應用程序的性質和最大指定堆大小,堆使用率可能會隨着垃圾收集器運行的頻率越來越低而超時運行。也就是說,如果沒有更多的信息,很難說正在發生什麼。

的幾種方法,以進一步調查:

它使用JMAP運行時,你可以把你的應用程序的堆轉儲,然後用與jHat,看看哪些對象是在堆在任何給定的時間檢查堆。

您也可以使用-XX:+ HeapDumpOnOutOfMemoryError運行應用程序,該應用程序將在JVM遇到的第一次內存不足異常時自動進行堆轉儲。

您可以創建特定於您的應用程序的監視bean,並創建可以使用遠程JMX客戶端訪問的訪問器方法。例如,返回可能在您的程序中使用內存的隊列和其他集合的大小的方法。

HTH

+0

不幸的是它比這更復雜一點。我需要相對持續地監測終身記憶的壓力。例如,我無法每10秒鐘進行一次堆轉儲。但即使如此,我並不十分關心正在使用的內存百分比,但是當推廣未能成功時代。儘管謝謝你的迴應! – Zack 2011-03-29 22:27:36

2

假設您使用的是Sun JVM,那麼我知道有兩個選項;

  1. 內存管理的MXBean(API裁判開始here),你似乎已正在使用但要注意有一些熱點特定內部的人,你可以訪問,看到this blog對於如何使用
  2. jstat爲例:cmd參考是here,您需要-gccause選項。你可以寫一個腳本來啓動它並解析輸出,或者理論上你可以從主機jvm(或另一個)產生一個進程,然後從jstat讀取輸出流來檢測gc的原因。我不認爲原因報告是100%全面的。我不知道從java代碼中以編程方式獲取此信息的方法。
+1

因此,使用GC MX bean是我現在正在做的。唯一可用的信息是非常通用的,只能從前後給我整體memeory使用。我希望能夠在我的應用程序中完成這項工作,但如果唯一的方法是進行系統調用,那麼就這樣做吧。我會檢查jstat。 – Zack 2011-03-30 18:05:44