天天看點

java.lang.OutOfMemoryError:PermGen space的一種解決辦法

Exception in thread "DefaultQuartzSchedulerThread" java.lang.OutOfMemoryError:PermGen space

Exception in thread "http-443-Processor24" java.lang.OutOfMemoryError:PermGen space

Exception in thread "http-443-Processor20" java.lang.OutOfMemoryError:PermGen space

Exception in thread "http-443-Processor22" java.lang.OutOfMemoryError:PermGen space

PermGen space的全稱是Permanent Generation space,是指記憶體的永久儲存區域,這塊記憶體主要是被JVM存放Class和Meta資訊的,Class在被Loader時就會被放到PermGen space中,它和存放類執行個體(Instance)的Heap區域不同,GC(Garbage Collection)不會在主程式運作期對PermGen space進行清理,是以如果你的應用中有很多CLASS的話,就很可能出現PermGen space錯誤,這種錯誤常見在web伺服器對JSP進行pre compile的時候。

在TOMCAT_HOME/bin/catalina.sh中設定記憶體大小

JAVA_OPTS="-server -Xms512m -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=128m -Djava.awt.headless=true "

若不設定jvm預設是4M大小

還有以下幾種原因的可能

 1,使用了proxool,因為proxool内部包含了一個老版本的cglib.

 2, log4j,最好不用,隻用common-logging

 3, 老版本的cglib,快點更新到最新版。

 4,更新到最新的hibernate3.2 3

但如果先前很長一段時間是好的,也沒經過大的改動,突然某一天使用某個功能時出現這種記憶體溢出,很有可能是在tomcat應用下部署了多個項目。

如我遇到的情況:

是部署在linux下的tomcat項目

webapps下有一個ROOT目錄,裡面放了所有web的.jsp頁面、.js檔案、lib庫(包括第三方庫),還有所有的.class檔案。

我由于備份過ROOT檔案夾,在webapps下出了ROOT還多了一個ROOT.bak檔案夾(裡面的内容跟ROOT下的相同),原以為這個檔案不會有什麼影響,可是恰恰是這個檔案夾,使tomcat啟動時加載了雙倍的庫和class檔案,并且從日志中發現它竟然使用了ROOT.bak下的資源。導緻預覽報表時頁面就吃吃沒有響應,然後報上面的記憶體溢出異常。我删除掉這個檔案夾以後就恢複正常了。

繼續閱讀