我在webapp中修復了3個不同的PermGen
OutOfMemoryError
問題,它在受限制的-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 OutOfMemoryError
當No GC root found
是什麼原因?
012h是否有可能在重新部署過程中處理應用程序請求?
我特別低PermGen
在應用程序重新部署期間強制GC在PermGen中,因爲PermGen
只在內存壓力下清除 - 我決定監視OutOfMemoryError是否仍然會影響我的應用程序。
感謝您的支持!我認爲我陷入了案件** 1 **。 I 已經考慮過將'PermGen'的尺寸設置爲應用程序 **的兩倍**。因此,通過你的描述感到驚訝,GC可能會失敗 由於多通機械...... – gavenkoa
我讀了關於GC年前所有的博客系列,以及任務中發揮 用'類加載器泄漏,prevention' 是我的TODO名單。但直到現在我沒有 熟練的追捕泄漏,所以應該重新讀你的博客)) – gavenkoa
我聽說並行GC與PermGen有問題,並認爲現代硬件已棄用。所以我總是使用'-XX:+ UseConcMarkSweepGC'(等待'G1'被普遍接受)。 – gavenkoa