不論是在開發還是在已經發布的項目中,我們經常會碰到的一個問題:
java.lang.OutOfMemoryError: PermGen space
PermGen space的全稱是Permanent Generation space,是指內存的永久保存區域,OutOfMemoryError: PermGen space從表面上看就是內存溢出,解決方法是加大內存。說說為什么會內存溢出:PermGen space用于存放Class和Meta的信息,Class在被 Load的時候被放入PermGen space區域,它和存放Instance的Heap區域不同,GC(Garbage Collection)不會在主程序運行期對PermGen space進行清理,所以如果你的APPLICATION會LOAD很多CLASS的話,就很可能出現PermGen space錯誤。這種錯誤常見在web服務器對JSP進行pre compile的時候。如果你的WEB APP下都用了大量的第三方jar, 其大小超過了jvm默認的大小(4M)那么就會產生此錯誤信息了。
建議:將相同的第三方jar文件移置到tomcat/lib目錄下,這樣可以達到減少jar 文檔重復占用內存的目的。
改正方法:-Xms256m -Xmx256m -XX:MaxNewSize=256m -XX:MaxPermSize=256m
其中-Xms<size> 為JVM初始化堆的大小
-Xmx<size> 為JVM堆的最大值
-XX:MaxNewSize 為調大新對象區,以減少垃圾回收器回收次數
但是有的時候可能這樣的設置還會不行(比如,當Server應用程序加載較多類時,即jvm加載類時,永久域中的對象急劇增加,從而使jvm不斷調整永久域大小,為了避免調整),你可以使用更多的參數配置,如: java -Xms512m -Xmx512m -XX:PermSize=64m -XX:MaxPermSize=128m
其中,使用 -XX:MaxPermSize標志來增加永久域的大小,-XX:PermSize標志設置初始值
如果虛擬機啟動時設置使用的內存比較小而在這種情況下有許多對象進行初始化,虛擬機就必須重復地增加內存來滿足使用。由于這種原因,我們一般把-Xms和-Xmx設為一樣大,而堆的最大值受限于系統使用的物理內存。一般使用數據量較大的應用程序會使用持久對象,內存使用有可能迅速地增長。當應用程序需要的內存超出堆的最大值時虛擬機就會提示內存溢出,并且導致應用服務崩潰。因此一般建議堆的最大值設置為可用內存的最大值的80%。
在tomcat中redeploy時出現outofmemory的錯誤.
可以有以下幾個方面的原因:
1,使用了proxool,因為proxool內部包含了一個老版本的cglib.
2, log4j,最好不用,只用common-logging
3, 老版本的cglib,快點更新到最新版。
4,更新到最新的hibernate3.2