2014-10-17 18 views
4

我目前正在運行一個長時間運行的JVM應用程序(包括groovy類),並且我觀察到一些奇怪的行爲。JVM內存清理沒有任何GC活動

我運行應用程序並更新我的Groovy類(正確清理metaclass信息等 - 我知道沒有泄漏),所以我知道有幾個類可以從permgen收集(通常我觀察到permgen isn我熱切地收集起來 - 我相信這只是完整的GC收集permgen,對於這個狀態並不罕見)。奇怪的是,如果我讓應用程序在沒有活動的情況下運行,大約一個小時左右後,內存使用量突然下降(堆和permgen,但最常見的是permgen),但visualvm報告沒有發生GC/CPU活動。

下面是我的VisualVM的截圖記錄

enter image description here

我的問題是怎麼出現在PermGen的這麼大的下降(〜80MB),沒有註冊的GC活動? visualvm通常會很好地記錄GC/CPU活動。

+0

當時是否有任何gc日誌?他們顯示什麼事情發生? – 2014-10-17 13:14:54

+0

除了基本圖表之外,沒有任何日誌 - 左上角的圖表顯示CPU/GC活動,正如您所看到的,沒有活動對應於permgen使用量的大幅下降(右上角) - 我會更多地關注gc日誌,但visualvm通常在其餘時間相當準確地繪製GC/CPU。 – rhinds 2014-10-17 13:30:06

回答

0

嘗試安裝visualgc插件,調查gc如何在這種情況下工作。我想很多新一代的物體被丟棄了,但我無法通過屏幕截圖來告訴它。

+0

它正在被丟棄(圖像右上方的圖像是permgen) - 所以不是新一代。問題更多的是關於如何收集〜80mb的permgen而沒有記錄GC活動(圖中左上圖)。 – rhinds 2014-10-21 11:20:21

+0

如何重現此? – user3118958 2014-10-21 14:29:09

+0

最簡單的方法是反覆加載類,但隨後釋放它們以免GC(例如使用Groovy,創建類加載器,加載類然後丟棄類加載器)。如果你在監控GC的時候這樣做,你可能會發現只有在Full-GC期間纔會收集Permgen,因此Permgen可能會收集到很多可以收集的類。我剛剛離開應用程序運行(沒有新的類被加載),然後一段時間(通常大約1小時左右),它只是下降。 – rhinds 2014-10-22 12:00:53