tomcat7內(nèi)存溢出錯誤的一些原因和解決方案
今天在做公司一個工程2個版本的運行時,突然出現(xiàn)新版的工程在tomcat中內(nèi)存溢出。
因為錯誤比較明顯,但也經(jīng)過了一些折騰。
我的tomcat版本為最新的7.0.34,eclipse為3.7
在tomcat的wiki上其實對內(nèi)存溢出和內(nèi)存錯誤已經(jīng)有一定的分析和說明
tomcat內(nèi)存出錯的一些原因:
1、建立的過多的對象,導(dǎo)致堆區(qū)內(nèi)存不足
2、有代碼被對象持有而導(dǎo)致垃圾收集器無法清理
3、超過了系統(tǒng)文件的大小限制,這樣你需要提高你的權(quán)限或者用一個不受限制的。
4、你工程的線程數(shù)目過多,某些系統(tǒng)在同一個進(jìn)程里對線程數(shù)目有限制,去看系統(tǒng)文檔,和學(xué)習(xí)怎么提高這個數(shù)目
5、系統(tǒng)也許限制了你的進(jìn)程的內(nèi)存大小
6、JVM有bug,一般在低版本的jvm才出現(xiàn)
還介紹了內(nèi)存溢出的一些常見處理方式
1、如果發(fā)現(xiàn)一個servlet裝載大量的內(nèi)容進(jìn)入內(nèi)存,你應(yīng)該檢查下你的代碼是不是有bug
2、手動增加堆內(nèi)存,導(dǎo)致沒有空間去創(chuàng)建必須創(chuàng)建的那些線程所需要的棧空間,每個系統(tǒng)對線程創(chuàng)建所要消耗的棧默認(rèn)不太相同,但是基本都高于2M,而且這個不能通過設(shè)置-Xss去減少
所以有一個規(guī)則,在32位系統(tǒng)下,對堆內(nèi)存的分配一般不超過1024M
3、深度遞歸算法會導(dǎo)致內(nèi)存出問題,因為方法信息都在棧中,所以一個可以用-Xss增加??臻g,另一個最好去優(yōu)化你的算法
4、加載了大量的jar包或者同時維持幾個項目將消耗你的非堆內(nèi)存,在這種情況下-XX:MaxPermSize 去增加你的非堆內(nèi)存
5、強(qiáng)引用導(dǎo)致垃圾收集器無法回收內(nèi)存??赡軙霈F(xiàn)jsp重編譯,工程重新加載,這將消耗大量時間,只到非堆內(nèi)存得到清理或者內(nèi)存溢出。
我今天的tomcat拋出的就是非堆內(nèi)存溢出,可能是因為新的版本又加了一些jar包的緣故。
處理過程
原文參考自站長網(wǎng)http://www.software8.co/wzjs/java/2575.html
第一次折騰:在tomcat\bin\catalina.bat 中 set JAVA_OPTS=%JAVA_OPT% -server -XX:PermSize=128m -XX:MaxPermSize=1024m
或者直接寫 set JAVA_OPTS= -XX:PermSize=128m -XX:MaxPermSize=1024m
直接在tomcat啟動,OK,工程正常啟動
但是發(fā)現(xiàn)eclipse不認(rèn)賬
第二次折騰,打開 open launch configuration
點擊Arguments選項卡
VM arguments 中添加
-Xms128m -Xmx1024m -XX:PermSize=128m -XX:MaxPermSize=1024

OK,解決完畢