首頁  >  文章  >  Java  >  jvm記憶體溢位解決方法(jvm記憶體溢位怎麼解決)

jvm記憶體溢位解決方法(jvm記憶體溢位怎麼解決)

高洛峰
高洛峰原創
2017-01-23 10:09:231214瀏覽

java.lang.OutOfMemoryError: PermGen space

發現很多人把問題歸因於: spring,hibernate,tomcat,因為他們動態產生類,導致JVM中的permanent heap溢出 。然後解決方法眾說紛紜,有人說升級 tomcat版本到最新甚至乾脆不用tomcat。還有人懷疑spring的問題,在spring論壇上討論很激烈,因為spring在AOP時使用CBLIB會動態產生很多類別。 
但問題是為什麼這些王牌的開源會出現同一個問題呢,那麼是不是更基礎的原因呢? tomcat在Q&A很隱晦的回答了這一點,我們知道這個問題,但這個問題是由一個更基礎的問題產生。 
於是有人對更基本的JVM做了檢查,發現了問題的關鍵。原來SUN 的JVM把記憶體分了不同的區,其中一個就是permenter區用來存放用得非常多的類別和類別描述。原本SUN設計的時候認為這個區域在JVM啟動的時候就 固定了,但他沒有想到現在動態會用得這麼廣泛。而且這個區域有特殊的垃圾回收機制,現在的問題是動態載入類別到這個區域後,gc根本沒辦法回收!

1、首先是:java.lang.OutOfMemoryError: Java heap space

解釋:

Heap size 設定

JVM堆的設定是指java程式運作過程中JVM可以調配使用的記憶體空間的設定.JVM啟動的時候會自動設定Heap size的值,其初始空間(即-Xms)是實體記憶體的1/64,最大空間(-Xmx)是實體記憶體的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等選項可進行設定。 Heap size 的大小是Young Generation 和Tenured Generaion 之和。 
提示:在JVM中如果98%的時間是用於GC且可用的Heap size 不足2%的時候將拋出此異常信息。 
提示:Heap Size 最大不要超過可用實體記憶體的80%,一般的要將-Xms和-Xmx選項設為相同,而-Xmn為1/4的-Xmx值。

解決方法:

手動設定Heap size 
修改TOMCAT_HOME/bin/catalina.bat,在「echo "Using CATALINA_BASE: $CATALINA_BASE"」上面加入以下行: 

Using CATALINA_BASE: $CATALINA_BASE"」上面加入以下行: 

set JAVA_OPTS=%JAVA_OPTS% -server -Xms800m -Xmx800m -XX:MaxNewSize=256m

catalina.sh下為: 

JAVA_OPTS="$JAVA_OPTS -server -Xms800m -Xmx800m -XX:MaxNewSize=256m" 
[html]
2、其次是:java.lang.OutOfMemoryError: PermGen space
原因:
PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中,它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的应用中有很CLASS的话,就很可能出现PermGen space错误,这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。
解决方法:
1. 手动设置MaxPermSize大小 
修改TOMCAT_HOME/bin/catalina.bat(Linux下为catalina.sh),在
[code]
“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行: 
set JAVA_OPTS=%JAVA_OPTS% -server -XX:PermSize=128M -XX:MaxPermSize=512m

更多jvm內存溢位解決方法(jvm內存溢位怎麼解決)相關文章請關注PHP網!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn