最近出現一個問題,在JBoss中部署完項目並運行時,請求網頁會報 java.lang.OutOfMemoryError: PermGen space
從網上搜資料後才知道,是由於PermGen space記憶體不足引起的。
分析原因:
1、 java.lang.OutOfMemoryError: PermGen space 從字面上也能看出是由於 PermGen space 的記憶體空間不足,而導致的記憶體溢出錯誤。
2、PermGen space的全稱是Permanent Generation space,是指記憶體的永久儲存地區。這一部分用於存放Class和Meta的資訊,Class在被 Load的時候被放入PermGen space地區,它和存放Instance的Heap地區不同,GC(Garbage Collection)不會在主程式運行期對PermGen space進行清理,所以如果你的APP會Load很多Class的話,就很可能出現PermGen space錯誤。這種錯誤常見在web伺服器對JSP進行pre compile的時候。
解決方案:
如果項目中引用了很多的 jar 包,那麼這些 jar 包中的 Class 資訊會被 JBoss 的 Class Loader 載入到 PermGen space 地區,而在 JVM 預設的情況下,該部分空間的大小隻有 4M,在 jar 包非常多的情況下,顯然是不夠用的。但可以通過 -XX:MaxPermSize=256m 指定最大值後即可解決問題。
CentOS 6.3下的解決步驟(其他系統類別似):
#cd /usr/local/jboss/bin#vim run.conf
修改run.conf中的JAVA_OPTS,增加
-XX:PermSize=256m -XX:MaxPermSize=512m 兩項內容,結果如下
JAVA_OPTS="-Xms256m -Xmx512m -XX:PermSize=256m -XX:MaxPermSize=512m -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000"