今天在做公司一個工程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,解決完畢