最近的服務(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;