2015-12-26 36 views
0

我在webapp中修復了3個不同的PermGenOutOfMemoryError問題,它在受限制的-XX:MaxPermSize=66m中存活了任何數量的redeploys(我不會嘗試大於30)。正在運行的應用程序需要〜55 MB的PermGen「沒有找到GC根目錄」時,PermGen OutOfMemoryError的原因是什麼?

修復內存泄漏的主要原因是爲了練習並使開發環境更愉快 - 在編譯後<Context reloadable="true">我的webapp已在3秒後重新部署!在catalina.out

我剛纔發現錯誤:

Dec 26, 2015 5:28:09 PM org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor run 
SEVERE: Unexpected death of background thread ContainerBackgroundProcessor[StandardEngine[Catalina]] 
java.lang.OutOfMemoryError: PermGen space 

Exception in thread "ContainerBackgroundProcessor[StandardEngine[Catalina]]" 
Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "ContainerBackgroundProcessor[StandardEngine[Catalina]]" 

像往常一樣,我跑visualvm和運行OQL:

select unique(map(heap.objects('java.lang.ClassLoader'), 'classof(it)')) 

和審查org.apache.catalina.loader.WebappClassLoader實例。我實際上做可以OQL描述:

filter(heap.objects('org.apache.catalina.loader.WebappClassLoader'), 
        'it.state.name.toString() == "DESTROYED"') 

這一個實例不會釋放PermGen內存。但是當我調用找到最近的GC根我得到沒有找到GC根

PermGen OutOfMemoryErrorNo GC root found是什麼原因?

012h是否有可能在重新部署過程中處理應用程序請求?

我特別低PermGen在應用程序重新部署期間強制GC在PermGen中,因爲PermGen只在內存壓力下清除 - 我決定監視OutOfMemoryError是否仍然會影響我的應用程序。

回答

1

有一些值得關注的東西。

  1. 您是否有足夠的PermGen同時容納至少2個應用程序的實例?我相信有時需要垃圾收集器多次傳遞才能刪除所有引用,因此需要爲GC釋放一個實例和另一個實例加載另一個實例。
  2. 嘗試切換到另一個垃圾收集器。我已經看到了我只能用GC和Parallell中的錯誤來解釋的情況,CMS和G1在這些情況下的行爲有所不同。
  3. 如果您想嘗試另一種查找GC根路徑的方法,可以查看this blog series of mineArit
  4. 您可能還想通過將我的ClassLoader Leak Prevention Library添加到您的應用程序來查看問題是否已解決。如果是這樣,請查看日誌以瞭解可能的原因。
+0

感謝您的支持!我認爲我陷入了案件** 1 **。 I 已經考慮過將'PermGen'的尺寸設置爲應用程序 **的兩倍**。因此,通過你的描述感到驚訝,GC可能會失敗 由於多通機械...... – gavenkoa

+0

我讀了關於GC年前所有的博客系列,以及任務中發揮 用'類加載器泄漏,prevention' 是我的TODO名單。但直到現在我沒有 熟練的追捕泄漏,所以應該重新讀你的博客)) – gavenkoa

+0

我聽說並行GC與PermGen有問題,並認爲現代硬件已棄用。所以我總是使用'-XX:+ UseConcMarkSweepGC'(等待'G1'被普遍接受)。 – gavenkoa

相關問題