tomcat7內存溢出錯誤的一些原因和解決方案



 今天在做公司一個工程2個版本的運行時,突然出現新版的工程在tomcat中內存溢出。

 

因爲錯誤比較明顯,但也經過了一些折騰。

 

我的tomcat版本爲最新的7.0.34,eclipse爲3.7

 

在tomcat的wiki上其實對內存溢出和內存錯誤已經有一定的分析和說明

 

tomcat內存出錯的一些原因:

 

1、建立的過多的對象,導致堆區內存不足

 

2、有代碼被對象持有而導致垃圾收集器無法清理

 

3、超過了系統文件的大小限制,這樣你需要提高你的權限或者用一個不受限制的。

 

4、你工程的線程數目過多,某些系統在同一個進程裏對線程數目有限制,去看系統文檔,和學習怎麼提高這個數目

 

5、系統也許限制了你的進程的內存大小

 

6、JVM有bug,一般在低版本的jvm纔出現

 

還介紹了內存溢出的一些常見處理方式

 

1、如果發現一個servlet裝載大量的內容進入內存,你應該檢查下你的代碼是不是有bug

 

2、手動增加堆內存,導致沒有空間去創建必須創建的那些線程所需要的棧空間,每個系統對線程創建所要消耗的棧默認不太相同,但是基本都高於2M,而且這個不能通過設置-Xss去減少

所以有一個規則,在32位系統下,對堆內存的分配一般不超過1024M

 

3、深度遞歸算法會導致內存出問題,因爲方法信息都在棧中,所以一個可以用-Xss增加棧空間,另一個最好去優化你的算法

 

4、加載了大量的jar包或者同時維持幾個項目將消耗你的非堆內存,在這種情況下-XX:MaxPermSize 去增加你的非堆內存

 

5、強引用導致垃圾收集器無法回收內存。可能會出現jsp重編譯,工程重新加載,這將消耗大量時間,只到非堆內存得到清理或者內存溢出。

 

我今天的tomcat拋出的就是非堆內存溢出,可能是因爲新的版本又加了一些jar包的緣故。

 

處理過程

 

第一次折騰:在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,工程正常啓動

 

但是發現eclipse不認賬

 

第二次折騰,打開 open launch configuration

點擊Arguments選項卡

VM arguments 中添加

 

-Xms128m -Xmx1024m -XX:PermSize=128m -XX:MaxPermSize=1024

 

OK,解決完畢

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章