問題:
最近做項目碰到了讓我糾結的問題,tomcat服務器運行一段時間,總是會自動報異常:Java.lang.OutOfmemoryError: PermGen Space 的錯誤,導致項目無法正常運行。
介紹:
PermGen Space:指的是內存的永久保存區,該塊內存主要是被JVM用來存放 class 和 mete 信息的,當 class 被加載 loader 的時候就會被存儲到該內存區中,與存放類的實例的heap區不同,java中的 垃圾回收器GC 不會在主程序運行期對 PermGen space 進行清理。
原因:
- 當我們的應用中有很多的class時,很可能就會出現PermGen space的錯誤。
- 我們的 tomcat 在重啓的時候,不是使用的 ./bin/shutdown.sh 而是使用 kill -9 xxx 直接殺掉,這樣的話,存在 PermGen space 裏面的內存不會被釋放的,這樣多長進行 kill 之後,就會導致系統的內存被漸漸吃完了,直到最後 tomcat 報錯。
解決方法:
手動設置MaxPermSize的大小:
修改 TOMCAT_HOME/bin/catalina.bat文件
在echo "using CATALINA_BASE:$CATALINA_BASE"上面加入這一行內容:
set JAVA_OPTS=%JAVA_OPTS% -server -XX:PermSize=128m -XX:MaxPermSize=512m