Java內存泄露 -PermGen 錯誤

我這個人比較懶,轉載下別人的。

把tomcat/bin/catalina.sh中的code改下

JAVA_OPTS="-Djava.awt.headless=true -Xms128m -Xmx1024m -XX:PermSize=128m -XX:MaxPermSize=128m -DBIZESSENCE_HOME=$BES_HOME"
順便解釋一下:xms表示堆內存默認值,xmx表示堆內存最大值

這一段時間,Eclipse總是死掉,幾乎是稍微操作快一點就會死掉,幾分鐘一次,搞得人鬱悶至極。浪費了不少時間,在網上搜了下,看到很多朋友也出現類似的情況,在網上求救,但是網上的辦法都只是說通過修改eclipse.ini文件來加大Eclipse的內存。 

    自己試了下,發現不管用。今天,又死掉了,不過爆出一個經常出現的錯誤,大意是:permgen space導致內存溢出。實在忍無可忍,上網一搜,發現網絡真是個好東西,尤其是對我們這種自學者而言,無疑是授業解惑的良師益友。

    這裏總結一下自己的經驗和網友的經驗,希望能夠對受此問題折磨的朋友有所參考價值。

解決辦法如下:

在eclipse.ini配置文件中加上以下兩行
-XX:PermSize=128M 
-XX:MaxPermSize=128M

加上上2行後,我的eclipse.ini文件如下所示:

-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
512m
-vmargs
-Xms256m
-Xmx512m
-XX:PermSize=128M 
-XX:MaxPermSize=128M

這裏的內存大小根據自己的物理內存情況來決定吧。

從網上的資料看PermSize大一點肯定更好,而且最好是設置PermSize和MaxPermSize一樣大。理由如下:
        PermSize 和MaxPermSize如果設置爲相同還可以在一定程度上提高性能,因爲,PermSize在不斷的變化中會需要轉移其中的數據。如果固定了以後,則可以減少每次擴大PermSize帶來的性能損失。

 

1、PermGen space簡介

PermGen space的全稱是Permanent Generation space,是指內存的永久保存區域OutOfMemoryError: PermGen space從表面上看就是內存益出,解決方法也一定是加大內存。

說說爲什麼會內存益出:
(1)這一部分用於存放Class和Meta的信息,Class在被 Load的時候被放入PermGen space區域,它和和存放Instance的Heap區域不同。
(2) GC(Garbage Collection)不會在主程序運行期對PermGen space進行清理,所以如果你的APP會LOAD很多CLASS的話,就很可能出現PermGen space錯誤。這種錯誤常見在web服務器對JSP進行pre compile的時候。

如果你的WEB APP下都用了大量的第三方jar,其大小超過了jvm默認的大小(4M)那麼就會產生此錯誤信息了。


解決方法: 手動設置MaxPermSize大小

修改TOMCAT_HOME/bin/catalina.sh,在echo "Using CATALINA_BASE:   $CATALINA_BASE"上面加入以下行:
       JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128m
建議:將相同的第三方jar文件移置到tomcat/shared/lib目錄下,這樣可以減少jar 文檔重複佔用內存。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章