永久空間內存不足 java.lang.OutOfMemoryError: PermGen space,相比不少使用spring,hibernate等一堆jar包的人都遇到過這個問題,在tomcat reload一個Context多次后,tomcat就掛掉了。
http://www.wujianrong.com/archives/2006/12/javalangoutofmemoryerror_permg.html
PermGen space這一部分用于存放Class和Meta的信息,Class在被 Load的時候被放入PermGen space區域,它和和存放Instance的Heap區域不同,GC(Garbage Collection)不會在主程序運行期對PermGen space進行清理,所以如果你的APP會LOAD很多CLASS的話,就很可能出現PermGen space錯誤。
我在做
TMS的發布工具的時候,就遇到了問題,這個工具的目的是把一個相同的系統,在tomcat下自動的發布多份,但當卸載,重新發布多次后, tomcat就掛了,整個電腦如同死機一般。后來使用文章里的set JAVA_OPTS=-server -Xms800m -Xmx800m -XX:PermSize=64M-XX:MaxNewSize=256m-XX:MaxPermSize=128m -Djava.awt.headless=true 解決了問題,不過在2G的電腦上,我是把-XX:MaxPermSize=128m 調到了-XX:MaxPermSize=256m。另外我還嘗試了把所有的lib都放到tomcat的lib下,一些lib就不能在本項目中再出現了。
現在看,還是spring,hibernate之類的產生的類導致PermGen space空間不足造成的這些問題。
http://www.javaeye.com/topic/80620?page=1 這個帖子里討論了這個問題,有人做了些有益的分析可以看看。
我又繼續在我的筆記本上做了測試T42,1G內存。tomcat版本6.0.14。
set JAVA_OPTS=-server -Xms256m -Xmx256m -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=256m -Djava.awt.headless=true
這個配置反復發布是可以的,另外又一次測試了將項目下的jar包放到tomcat的lib下的對比。重新安裝一個lib下為空的程序是10秒,否則是30秒。