系統(tǒng)有時(shí)會(huì)遇到OutOfMemoryError,Java堆溢出了。我們需要找到造成OutOfMemoryError原因。一般有兩種情況:
1、內(nèi)存泄露,對象已經(jīng)死了,無法通過垃圾收集器進(jìn)行自動(dòng)回收;
2、內(nèi)存溢出,內(nèi)存中的對象都還必須存活著,這說明Java堆分配空間不足,檢查堆設(shè)置大小(-Xmx與-Xms),檢查代碼是否存在對象生命周期太長、持有狀態(tài)時(shí)間過長的情況。
想在泄漏未發(fā)生前,取堆轉(zhuǎn)儲(chǔ)文件分析, 通過jvm參數(shù)-XX:+HeapDumpOnOutOfMemoryError(XX:+HeapDumpOnCtrlBreak不知道為什么tomcat啟動(dòng)不了)可以讓JVM在出現(xiàn)內(nèi)存溢出是Dump出當(dāng)前的內(nèi)存轉(zhuǎn)儲(chǔ)快照。
當(dāng)然也可以通過用jmap生產(chǎn)dump文件。windows通過任務(wù)管理器查看tomcat的進(jìn)程pid,linux用ps命令查看進(jìn)程pid,然后用jmap命令(Java5:jmap -heap:format=b <pid>;Java6:jmap -dump:format=b,file=HeapDump.bin <pid>)
在tomcat中設(shè)置jvm參數(shù)
linux系統(tǒng)中
1.打開/tomcat_home/bin/catalina.sh文件
2.加上:JAVA_OPTS="$JAVA_OPTS -server -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\heapdump"
如下圖位置:

注:其中不設(shè)-XX:HeapDumpPath時(shí),dump出的文件在/tomcat_home/bin目錄下
Windows系統(tǒng)中
1.打開/tomcat_home/bin/catalina.bat文件
2.加上:set JAVA_OPTS=%JAVA_OPTS% -server -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\heapdump
如下圖位置:

分析dump出來的內(nèi)存快照文件
可以使用分析工具進(jìn)行分析,如:
Eclipse的MAT
下載地址:http://www.eclipse.org/mat/downloads.php
說明文檔:http://www.vogella.com/articles/EclipseMemoryAnalyser/article.html#example_project
注意:解析過大的HeapDump可能導(dǎo)致Eclipse拋出OutOfMemory的錯(cuò)誤。這時(shí)你需要手動(dòng)調(diào)整Eclipse的緩存大小,可以參考官網(wǎng)給出的處理方式(原文連接)
Alternatively, edit the MemoryAnalyzer.ini
to contain:
-vmargs
-Xmx2g
-XX:-UseGCOverheadLimit
Eclipse插件版打不開的朋友可以試試 RPC版的MAT (我的232m的dump文件也打不開,難道非得用64bit的機(jī)器嗎?):RPC版MAT下載地址 。
JProfile
等等;
轉(zhuǎn)自:http://jiangsha.iteye.com/blog/1576355
posted on 2013-03-18 16:53
zhangxl 閱讀(20325)
評(píng)論(2) 編輯 收藏 所屬分類:
優(yōu)化