2014-03-04 29 views
0

幾次重新部署應用程序與PermGen錯誤崩潰後。我知道隨着permgen大小的增加變通辦法。但我試圖揭示泄漏的原因。在重新部署之後,我使用jvisualvm創建堆轉儲並搜索WebAppClassLoader的實例。正如預期的那樣,還有一個沒有GC-ed。向platformMBeanServer(MangementFactory類型)顯示最近的GC根點。所以問題是我能用它做什麼?網絡應用程序,tomcat + hibernate + Guice中的內存泄露

enter image description here

和一些額外的信息。我的jdbc驅動程序jar位於bin目錄中的tomcat和.dll文件的lib目錄中。當我評論hibernate的sessionFactory創建 - 問題消失。會話工廠在servlet過濾器的init方法中創建,並在destroy方法中關閉。 Hibernate使用c3p0連接池。

+0

您需要關注GC根源。他們是否將你指向特定的對象,或者你只是在猜測?嘗試閱讀http://people.apache.org/~markt/presentations/2010-11-04-Memory-Leaks-60mins.pdf找出如何找到這些內存泄漏。 –

回答

0

我找到了解決方案。它變成連接池c3p0 0.9.2.1有內存泄漏。休眠4.3.1-Final使用該版本的c3p0。切換到休眠4.1.12和c3p0 0.9.1解決了我的問題。

0

您可以嘗試添加這些Java選項:

-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled 

這使得垃圾收集PermGen的空間(默認關閉),並允許GC卸載類。

+0

感謝您的建議,但沒有任何改變。 GC無法清除它,因爲存在舊WebAppClassLoader的存在 – Kolchuga

+0

PermGen清理始終處於啓用狀態,否則無法卸載類。他們卸載很好,沒有添加任何選項。 –