運行內(nèi)存異常 java.lang.OutOfMemoryError處理建議

最近的服務(wù)器塞了太多的測試項目,結(jié)果連累其他在跑的項目。

異常錯誤:Handler?dispatch?failed;?nested?exception?is?java.lang.OutOfMemoryError:?GC?overhead?limit?exceeded

這個是運行內(nèi)存不夠?qū)е碌摹?/p>


原因分析:

常見的有以下幾種:

1.內(nèi)存中加載的數(shù)據(jù)量過于龐大,如一次從數(shù)據(jù)庫取出過多數(shù)據(jù);

2.集合類中有對對象的引用,使用完后未清空,使得JVM不能回收;

3.代碼中存在死循環(huán)或循環(huán)產(chǎn)生過多重復(fù)的對象實體;

4.使用的第三方軟件中的BUG;

5.啟動參數(shù)內(nèi)存值設(shè)定的過小;

常見錯誤提示:

1.tomcat:java.lang.OutOfMemoryError: PermGen space?

2.tomcat:java.lang.OutOfMemoryError: Java heap space

3.tomcat:java.lang.OutOfMemoryError: unable to create new native thread

4.weblogic:Root cause of ServletException java.lang.OutOfMemoryError

5.resin:java.lang.OutOfMemoryError

6.java:java.lang.OutOfMemoryError

分為兩種情況:

1、用dos窗口啟動tomcat

Windows下,在文件{tomcat_home}/bin/catalina.bat

在文件開頭可增加如下設(shè)置:

set JAVA_OPTS=-Xms512m -Xmx512m -Xss1024k -XX:MaxNewSize=256M -XX:MaxPermSize=256M

Unix/Linux下,在文件{tomcat_home}/bin/catalina.sh的前面,可增加如下設(shè)置:

JAVA_OPTS='-Xms512m -Xmx512m -Xss1024k -XX:MaxNewSize=256M -XX:MaxPermSize=256M'

各參數(shù)釋義:

-Xms:程序初始化的時候內(nèi)存棧的大小。

-Xmx:應(yīng)用程序(不是jvm)能夠使用的最大內(nèi)存數(shù),這個值也不應(yīng)該設(shè)置過大,超過機(jī)器內(nèi)存。否則,tomcat會無法啟動。此值可以設(shè)置與-Xmx相同,以避免每次垃圾回收完成后JVM重新分配內(nèi)存。

-Xss:設(shè)置每個線程的堆棧大小。JDK5.0以后每個線程堆棧大小為1M。

-XX:MaxPermSize:設(shè)置持久代大小

-XX:NewSize:設(shè)置年輕代大小

2、tomcat做為系統(tǒng)服務(wù)

修改tomcat路徑下bin文件夾下service.bat文件

找到"%EXECUTABLE%" //US//%SERVICE_NAME% --JvmOptions

在后面的雙引號""中間添加:-Xms512M;-Xmx1024M;-XX:NewRatio=3;-XX:PermSize=256M;-XX:MaxPermSize=512M;-XX:-UseGCOverheadLimit;

然后卸載掉服務(wù),重新安裝一遍,啟動,生效。

-----------------------------------------------------

1、java.lang.OutOfMemoryError: unable to create new native thread

常見出現(xiàn)在進(jìn)行

set JAVA_OPTS=-Xms512m -Xmx512m -Xss1024k -XX:MaxNewSize=256M -XX:MaxPermSize=256M

設(shè)置后

JVM申請的heap會占用相同大小的地址空間(address space)。在Windows 32位操作系統(tǒng)中,分配給每個程序的地址空間只有2GB(當(dāng)然也有3GB的開關(guān))。

而每個不同的JVM的堆和其創(chuàng)建的進(jìn)程棧都依賴于同一個進(jìn)程地址空間,所以這也是此消彼長的原因。?

有方法可以提高創(chuàng)建線程的數(shù)量: 減少單個線程棧的大小,在JVM啟動中使用-Xss參數(shù)。

建議

set JAVA_OPTS=-Xms512m -Xmx512m -Xss512k -XX:MaxNewSize=256M -XX:MaxPermSize=256M

2、Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded

常見出現(xiàn)在進(jìn)行

在后面的雙引號""中間添加:-Xms512M;-Xmx1024M;-XX:NewRatio=3;-XX:PermSize=256M;-XX:MaxPermSize=512M;-XX:-UseGCOverheadLimit;

設(shè)置后

JDK6新增錯誤類型。當(dāng)GC為釋放很小空間占用大量時間時拋出。

一般是因為堆太小。導(dǎo)致異常的原因:沒有足夠的內(nèi)存。

建議

在雙引號""中間添加一個-XX:-UseGCOverheadLimit;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容