2010-01-03 79 views
13

我有一個perm gen內存泄漏,我知道。使用jvisualvm進行分析表明,在進行熱部署時(例如,在不殺死JVM的情況下停止和啓動應用程序,在tomcat,WebSphere,WebLogic等中) - PermGen空間不斷增加。Java類(PermGen)內存泄漏(Web應用程序) - 通用解決方案?

閱讀完後,使用jhat和其他高級工具,我意識到我可能從其父類加載器中的某個類的某處引用了WebAppClassLoader

我不能針下來,即使我做了一些與jHat大量基於JavaScript的查詢

沒有一個簡單的工具,找出誰是負責你的類加載器不被垃圾收集(因此允許垃圾回收由它加載的類)?

我試過的JProfiler,jvisualvm,與jHat,很多谷歌

的所有LMGTFY朋友 - 我花了大約一天半的時間閱讀論壇步驟分步說明,沒有運氣。我正在尋找一個輸出的實用程序或代碼:

Y類的對象X是唯一的GC根目錄,可以防止您的類被刪除。

+0

JProfiler給你什麼信息?當你明確地調用垃圾收集器時,什麼對象留下來? – Bozho 2010-01-03 20:17:44

+0

和你如何做熱部署(在tomcat上)? – Bozho 2010-01-03 20:49:16

+0

@Bozho - 使用Tomcat Manager,按停止/啓動。 停留的對象是WebAppClassLoader及其所有加載的類。最接近的GC根追捕沒有給出實際結果。 – 2010-01-04 06:08:10

回答

11

有一個令人無法滿足但很容易的解決方案:不要在生產環境中進行熱部署。您可以設置兩個servlet容器的集羣,並且每次都重新啓動一個集羣。這裏

+1

這是高可用性部署體系結構的一個很常見的模式。 – 2010-01-03 22:25:16

+0

那麼如何說服客戶呢?有沒有描述這種模式的白皮書? – 2010-01-04 06:17:02

+2

這不應該是被接受的答案。我在本地測試環境中遇到同樣的問題,如果可以的話,我真的很想避免重新啓動Tomcat。 – ripper234 2010-05-20 13:39:13

5

頻繁重新部署的現實... 最好你可以做的是使用-XX:MaxPermSize = 256m增加燙髮的尺寸。這可能會爲每個jvm重新啓動更多的重新部署。 或在http://my.opera.com/karmazilla/blog/2007/03/15/permgen-strikes-back

請仔細閱讀,如果類加載器根本無法使用gc-ed,擺弄jvm根本無濟於事。你最好忘記頻繁部署,尤其是在生產中,儘管如此,它還是很方便的。

+0

我們已經有256個,允許4-5個重新部署 – 2010-01-04 06:14:29