Deal with java.lang.OutOfMemoryError: Perm-Gen Space

做Portlet 測試時常遇到

PermGen space的全稱是Permanent Generation space,是指記憶體的永久保存區域OutOfMemoryError: PermGen space從表面上看就是記憶體益出,解決方法也一定是加大記憶體。說說為什麼會記憶體益出:這一部分用於存放ClassMeta的資訊,Class在被 Load的時候被放入PermGen space區域,它和和存放InstanceHeap區域不同,GC(Garbage Collection)不會在主程序運行期對PermGen space進行清理,所以如果你的APPLOAD很多CLASS的話,就很可能出現PermGen space錯誤。這種錯誤常見在web伺服器對JSP進行pre compile的時候。

改正方法,在 run.bat 中加入:-Xms256m -Xmx512m -XX:MaxNewSize=256m -XX:MaxPermSize=256m

以上的值都可以自訂,看你的server有強囉

因為項目中引用了很多的 jar 包,而這些 jar 包中的 class 資訊會被 JBoss class loader 載入到 PermGen space 區域,在 JVM 默認的情況下,該部分空間的大小只有 4M,在 jar 包非常多的情況下,顯然是不夠用的,所以通過 -XX:MaxPermSize=256m 指定最大值後即可解決問題。

另外,如果 heap 記憶體不足出現 java.lang.OutOfMemoryError: Java heap space 時,可以通過 -Xmx512m 指定最大 heap 記憶體來解決這樣的問題。