今天碰到了這個(gè)問(wèn)題:
javax.servlet.ServletException: PermGen space
at org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:848)
at org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:781)
查了一下, PermGen space的全稱(chēng)是Permanent Generation space,是指內(nèi)存的永久保存區(qū)域OutOfMemoryError: PermGen space從表面上看就是內(nèi)存益出,解決方法也一定是加大內(nèi)存。說(shuō)說(shuō)為什么會(huì)內(nèi)存益出:這一部分用于存放Class和Meta的信息,Class在被 Load的時(shí)候被放入PermGen space區(qū)域,它和和存放Instance的Heap區(qū)域不同,GC(Garbage Collection)不會(huì)在主程序運(yùn)行期對(duì)PermGen space進(jìn)行清理,所以如果你的APP會(huì)LOAD很多CLASS的話,就很可能出現(xiàn)PermGen space錯(cuò)誤。這種錯(cuò)誤常見(jiàn)在web服務(wù)器對(duì)JSP進(jìn)行pre compile的時(shí)候。
改正方法:-Xms256m -Xmx256m -XX:MaxNewSize=256m -XX:MaxPermSize=256m
把PermGen space開(kāi)大點(diǎn)就行了
GC(Garbage Collection)應(yīng)該不會(huì)對(duì)PermGen space進(jìn)行清理
所以如果你的APP會(huì)LOAD很多CLASS的話,就很可能出現(xiàn)PermGen space錯(cuò)誤
項(xiàng)目是TOMCAT的WEB APP,由于沒(méi)有在發(fā)布的時(shí)候?qū)SP進(jìn)行pre compile,
所以那個(gè)錯(cuò)誤是在運(yùn)行是出現(xiàn)的,相信如果把pre compile加上的話,
在啟動(dòng)APP的時(shí)候就會(huì)出錯(cuò)了.
這也與我用熱部署功能相關(guān), tomcat不重起多次部署, tomcat不會(huì)清理前面加載得環(huán)境, 僅僅是將context跟改掉為新部署得,所以將越來(lái)越多, 導(dǎo)致出現(xiàn)此問(wèn)題
參考連接:
http://www-128.ibm.com/developerworks/cn/java/l-JavaMemoryLeak/index.html
http://topic.csdn.net/t/20051107/17/4377324.html
http://blog.chinaunix.net/u/22374/showart.php?id=1652Array1