javax.servlet.ServletException: PermGen space 錯(cuò)誤解決方法
最近在用一個(gè)TOMCAT服務(wù)部署多個(gè)項(xiàng)目時(shí)碰到有時(shí)添加的新項(xiàng)目出現(xiàn)javax.servlet.ServletException: PermGen space這個(gè)錯(cuò)誤,經(jīng)網(wǎng)上尋找資料,以下內(nèi)容測(cè)試正確最 近在把在 tomcat 5.5 上開發(fā)的項(xiàng)目 deploy 到 JBoss 4.2 上時(shí),在操作一段時(shí)間就會(huì)出現(xiàn) java.lang.OutOfMemoryError: PermGen space,開始以為是代碼中存在死循環(huán)的地方造成這樣的問(wèn)題,但是后來(lái)發(fā)現(xiàn),出問(wèn)題的地方都是隨機(jī)的,并不是某一處造成這樣的問(wèn)題出現(xiàn),懷疑是內(nèi)存泄 露,通過(guò)增大 heap 內(nèi)存的方法來(lái)嘗試,依然不行,但是同樣的問(wèn)題卻并沒有在 tomcat 中出現(xiàn)過(guò),難道是 JBoss 的問(wèn)題?
在網(wǎng)上做了一番搜索得到一些相關(guān)的內(nèi)容。
PermGen space的全稱是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ò)誤常見在web服務(wù)器對(duì)JSP進(jìn)行pre compile的時(shí)候。
改正方法,在 run.bat 中加入:-Xms256m -Xmx512m -XX:MaxNewSize=256m -XX:MaxPermSize=256m
因 為項(xiàng)目中引用了很多的 jar 包,而這些 jar 包中的 class 信息會(huì)被 JBoss 的 class loader 加載到 PermGen space 區(qū)域,在 JVM 默認(rèn)的情況下,該部分空間的大小只有 4M,在 jar 包非常多的情況下,顯然是不夠用的,所以通過(guò) -XX:MaxPermSize=256m 指定最大值后即可解決問(wèn)題。
另外,如果 heap 內(nèi)存不足出現(xiàn) java.lang.OutOfMemoryError: Java heap space 時(shí),可以通過(guò) -Xmx512m 指定最大 heap 內(nèi)存來(lái)解決這樣的問(wèn)題。
posted on 2009-03-05 16:33 找個(gè)美女做老婆 閱讀(4529) 評(píng)論(0) 編輯 收藏