內(nèi)存溢出常見的兩種:java.lang.OutOfMemoryError: PermGen space
java.lang.OutOfMemoryError: Java heap space
PermGen space指的是內(nèi)存的永久保存區(qū)域。這塊內(nèi)存主要是被JVM存放Class和Meta信息的,如果你的應(yīng)用中有很多CLASS的話,就很可能出現(xiàn)PermGen space錯(cuò)誤, 這種錯(cuò)誤常見在web服務(wù)器對(duì)JSP進(jìn)行pre compile的時(shí)候。如果你的WEB APP下都用了大量的第三方j(luò)ar, 其大小超過了jvm默認(rèn)的大小(4M)那么就會(huì)產(chǎn)生此錯(cuò)誤信息了。可以通過修改PermSize來(lái)修改。
Java heap space指的是Heap size的設(shè)置太小造成的。Heap size是指java程序運(yùn)行過程中JVM可以調(diào)配使用的內(nèi)存空間的設(shè)置.JVM在啟動(dòng)的時(shí)候會(huì)自動(dòng)設(shè)置Heap size的值,其初始空間(即-Xms)是物理內(nèi)存的1/64,最大空間(-Xmx)是物理內(nèi)存的1/4。所以我們可以把-Xms和-Xmx的值設(shè)置大一點(diǎn),就不會(huì)報(bào)錯(cuò)了。
提示:在JVM中如果98%的時(shí)間是用于GC且可用的Heap size 不足2%的時(shí)候?qū)伋龃水惓P畔ⅰ?
提示:Heap Size 最大不要超過可用物理內(nèi)存的80%,一般的要將-Xms和-Xmx選項(xiàng)設(shè)置為相同,而-Xmn為1/4的-Xmx值。比如我們的內(nèi)存是1G,則-Xms和-Xmx的值可以設(shè)置為800m。
?
需要注意的是,如果是32位系統(tǒng),所能使用的內(nèi)存最大為2G。就算電腦內(nèi)存是4G,也是一樣。64位則沒有這個(gè)限制。
?
下面分析Tomcat使用虛擬目錄和不使用虛擬目錄的的修改方式(虛擬目錄理解起來(lái)比較抽象,如果沒有用過的人,可能對(duì)此比較陌生。簡(jiǎn)單來(lái)說(shuō),如果用eclipse自帶的Servers,在Servers里面配置了Tomcat服務(wù)器,這種方式是原始的,是不涉及虛擬目錄的。如果你用了eclipse的Tomcat插件,我們需要在tomcat/cong/catalina/localhost下創(chuàng)建一個(gè)xml文件,文件中配置的就是虛擬目錄):
1、不使用虛擬目錄的時(shí)候
eclipse--Run--Run Configurations--左側(cè)選擇Apache Tomcat--右側(cè)第二個(gè)"=Arguments"--在VM arguments的最前面加入?yún)?shù):-server -Xms800m -Xmx800m -XX:MaxPermSize=256M即可。
也可以通過修改tomcat/bin/catalina.bat(Window環(huán)境),tomcat/bin/catalina.sh(Linux環(huán)境)文件來(lái)達(dá)到目的。
Window環(huán)境下,catalina.bat文件前面加上:
JAVA_OPTS="-server -Xms1200m -Xmx1200m -XX:MaxPermSize=256m -Djava.awt.headless=true"
最后一個(gè)參數(shù)-Djava.awt.headless=true和圖形處理有關(guān),可有可無(wú)。必須的參數(shù)是:Xms Xmx PermSize
Linux環(huán)境下,catalina.sh文件前面加上:
JAVA_OPTS="="-server -Xms1024m -Xmx1024m -XX:MaxPermSize=256m -Djava.awt.headless=true"
?
2、使用虛擬目錄的時(shí)候
使用虛擬目錄的時(shí)候,要在eclipse中配置。
Window--Preferences--Tomcat--JVM Settings--Append to JVM Parameters下添加三條:
-Xms800m
-Xmx800m
-XX:PermSize=128M
Xms:jvm初始化堆大小
Xmx:jvm最大堆大小(一般xms和xmx設(shè)置一樣,但不得超過系統(tǒng)內(nèi)存80%)
Xmn: 設(shè)置年輕代大小為2G。 整個(gè)JVM內(nèi)存大小=年輕代大小 + 年老代大小 + 持久代大小 。持久代一般固定大小為64m,所以增大年輕代后,將會(huì)減小年老代大小。此值對(duì)系統(tǒng)性能影響較大,Sun官方推薦配置為整個(gè)堆的3/8。
Xss: 設(shè)置每個(gè)線程的堆棧大小。
XX:PermSize:非堆區(qū)大小
XX:MaxPermSize:最大非堆區(qū)大小
?
?
?
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
