JAVA HEAP SPACE解決方法和JVM參數(shù)設(shè)置
- JAVA HEAP SPACE解決方法和JVM參數(shù)設(shè)置
-
- 原因分析
- 設(shè)置
- 異常分析
- Java堆的管理—垃圾回收提到一下幾點(diǎn),很不錯(cuò),或許可以作為寫程序時(shí)候的準(zhǔn)則:
- jvm 內(nèi)存查看與分析工具
JAVA HEAP SPACE解決方法和JVM參數(shù)設(shè)置
在JVM中如果98%的時(shí)間是用于GC(Garbage Collection)且可用的 Heap size 不足2%的時(shí)候?qū)伋霎惓P畔?,java.lang.OutOfMemoryError: Java heap space。
所以產(chǎn)生這個(gè)異樣的原因通常有兩種:
1.程序中出現(xiàn)了死循環(huán)
2.程序占用內(nèi)存太多,超過了JVM堆設(shè)置的最大值。
原因分析
第二種情況,我們手工擴(kuò)大JVM堆的參數(shù)設(shè)置。JVM堆的設(shè)置是指java程序運(yùn)行過程中JVM可以調(diào)配使用的內(nèi)存空間的設(shè)置。在JVM啟動(dòng)時(shí),JVM堆會(huì)自動(dòng)設(shè)置heap size值。通常情況下,初始空間(即-Xms)默認(rèn)值是物理內(nèi)存的1/64,最大空間是物理內(nèi)存的1/4??梢岳肑VM提供的-Xmn -Xms -Xmx等選項(xiàng)可進(jìn)行設(shè)置。這里對各個(gè)參數(shù)的意義解釋一下:
-Xms:初始值
-Xmx:最大值
-Xmn:最小值
Heap
Size的設(shè)置不宜太小,也不宜太大。若設(shè)置太小程序的響應(yīng)速度會(huì)變慢了,因?yàn)镚C占用了更多的時(shí)間,而應(yīng)用分配到的執(zhí)行時(shí)間較少。太大也會(huì)造成空間的浪費(fèi),而且也會(huì)影響其他程序的正常運(yùn)行。Heap
Size 最大最好不要超過可用物理內(nèi)存的80%。建議將-Xms和-Xmx選項(xiàng)設(shè)置為相同,而-Xmn為1/4的-Xmx值。
設(shè)置的方法主要有以下幾個(gè):
-
就是在執(zhí)行JAVA類文件時(shí)加上這個(gè)參數(shù),其中className是需要執(zhí)行的確類名。(包括包名)如:java -Xms32m -Xmx800m className 這個(gè)不僅解決問題了,而且執(zhí)行的速度比沒有設(shè)置的時(shí)候快很多。
-
可以在windows更改系統(tǒng)環(huán)境變量加上JAVA_OPTS=-Xms64m -Xmx512m。
-
如果用的tomcat,在windows下,可以在C: omcat5.5.9incatalina.bat(具體路徑根據(jù)自己tomcat的位置而定) 中加上:set JAVA_OPTS=-Xms64m -Xmx256m (大小依自己內(nèi)存而定)位置在: rem Guess CATALINA_HOME if not defined 這行的下面加合適.
-
如果是linux系統(tǒng)Linux 在{tomcat_home}/bin/catalina.sh的前面,加 set JAVA_OPTS=’-Xms64 -Xmx512’
設(shè)置
1、設(shè)置環(huán)境變量
set JAVA_OPTS= -Xms32m -Xmx512m
可以根據(jù)自己機(jī)器的內(nèi)存進(jìn)行更改,但本人測試這種方法并沒有解決問題??赡苁沁€有哪里需要設(shè)置。
2、 java -Xms32m -Xmx800m className
就是在執(zhí)行JAVA類文件時(shí)加上這個(gè)參數(shù),其中className是需要執(zhí)行的確類名。(包括包名)
這個(gè)解決問題了。而且執(zhí)行的速度比沒有設(shè)置的時(shí)候快很多。
異常分析
使用Java程序從數(shù)據(jù)庫中查詢大量的數(shù)據(jù)時(shí)出現(xiàn)異常:
java.lang.OutOfMemoryError: Java heap space
在JVM中如果98%的時(shí)間是用于GC且可用的 Heap size 不足2%的時(shí)候?qū)伋龃水惓P畔ⅰ?/p>
JVM堆的設(shè)置是指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??梢岳肑VM提供的-Xmn -Xms
-Xmx等選項(xiàng)可進(jìn)行設(shè)置。 例如:java -jar -Xmn16m -Xms64m -Xmx128m MyApp.jar
如果Heap Size設(shè)置偏小,除了這些異常信息外,還會(huì)發(fā)現(xiàn)程序的響應(yīng)速度變慢了。GC占用了更多的時(shí)間,而應(yīng)用分配到的執(zhí)行時(shí)間較少。
Heap Size 最大不要超過可用物理內(nèi)存的80%,一般的要將-Xms和-Xmx選項(xiàng)設(shè)置為相同,而-Xmn為1/4的-Xmx值。
Heap size的 -Xms -Xmn 設(shè)置不要超出物理內(nèi)存的大小。否則會(huì)提示“Error occurred during initialization of VM Could not reserve enough space for object
heap”。
Java堆的管理—垃圾回收提到一下幾點(diǎn),很不錯(cuò),或許可以作為寫程序時(shí)候的準(zhǔn)則:
(1)不要試圖去假定垃圾收集發(fā)生的時(shí)間,這一切都是未知的。比如,方法中的一個(gè)臨時(shí)對象在方法調(diào)用完畢后就變成了無用對象,這個(gè)時(shí)候它的內(nèi)存 就可以被釋放。
(2)Java中提供了一些和垃圾收集打交道的類,而且提供了一種強(qiáng)行執(zhí)行垃圾收集的方法–調(diào)用System.gc(),但這同樣是個(gè)不確定 的方法。Java 中并不保證每次調(diào)用該方法就一定能夠啟動(dòng)垃圾收集,它只不過會(huì)向JVM發(fā)出這樣一個(gè)申請,到底是否真正執(zhí)行垃圾收集,一切都是個(gè)未知數(shù)。
(3)挑選適合自己的垃圾收集器。一般來說,如果系統(tǒng)沒有特殊和苛刻的性能要求,可以采用JVM的缺省選項(xiàng)。否則可以考慮使用有針對性的垃圾收 集器,比如增量收集器就比較適合實(shí)時(shí)性要求較高的系統(tǒng)之中。系統(tǒng)具有較高的配置,有比較多的閑置資源,可以考慮使用并行標(biāo)記/清除收集器。
(4)關(guān)鍵的也是難把握的問題是內(nèi)存泄漏。良好的編程習(xí)慣和嚴(yán)謹(jǐn)?shù)木幊虘B(tài)度永遠(yuǎn)是最重要的,不要讓自己的一個(gè)小錯(cuò)誤導(dǎo)致內(nèi)存出現(xiàn)大漏洞。
(5)盡早釋放無用對象的引用。
jvm 內(nèi)存查看與分析工具
1:gc日志輸出
在jvm啟動(dòng)參數(shù)中加入
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimestamps
-XX:+PrintGCApplicationStopedTime
jvm將會(huì)按照這些參數(shù)順序輸出gc概要信息,詳細(xì)信息,gc時(shí)間信息,gc造成 的應(yīng)用暫停時(shí)間。如果在剛才的參數(shù)后面加入?yún)?shù) -Xloggc:文件路徑,gc信息將會(huì)輸出到指定的文件中。其他參數(shù)還有
-verbose:gc和-XX:+PrintTenuringDistribution等。
2:jconsole
jconsole是jdk自帶的一個(gè)內(nèi)存分析工具,它提供了圖形界面。可以查看到被監(jiān)控的jvm的內(nèi)存信息,線程信息,類加載信息,MBean信息。
jconsole位于jdk目錄下的bin目錄,在windows下是
jconsole.exe
,在unix和linux下是
jconsole.sh,jconsole可以監(jiān)控本地應(yīng)用,也可以監(jiān)控遠(yuǎn)程應(yīng)用。文章來源:http://www.zghlxwxcb.cn/news/detail-463424.html
要監(jiān)控本地應(yīng)用,執(zhí)行jconsole pid,pid就是運(yùn)行的java進(jìn)程id,如果不帶上pid參數(shù),則執(zhí)行jconsole命令后,會(huì)看到一個(gè)對話框彈出,上面列出了本地的java進(jìn) 程,可以選擇一個(gè)進(jìn)行監(jiān)控。如果要遠(yuǎn)程監(jiān)控,則要在遠(yuǎn)程服務(wù)器的jvm參數(shù)里加入一些東西,因?yàn)閖console的遠(yuǎn)程監(jiān)控基于jmx的,關(guān)于 jconsole詳細(xì)用法,請見專門介紹jconsle的文章,我也會(huì)在博客里專門詳細(xì)介紹jconsole。文章來源地址http://www.zghlxwxcb.cn/news/detail-463424.html
到了這里,關(guān)于JAVA HEAP SPACE解決方法和JVM參數(shù)設(shè)置的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!