tomcat記憶體溢位問題記錄

散盡浮華發表於2017-02-28

 

問題說明:
公司內網環境中部署的jenkins程式碼發版平臺突然不能訪問了,檢視tomcat的catalina.out日誌發現報錯如下:

[root@redmine logs]# tail -f /srv/apache-tomcat-7.0.67/logs/catalina.out
......
Exception in thread "http-bio-8080-exec-5" java.lang.OutOfMemoryError: PermGen space
Exception in thread "http-bio-8080-exec-5" java.lang.OutOfMemoryError: PermGen space
Exception in thread "http-bio-8080-exec-5" java.lang.OutOfMemoryError: PermGen space
......

上面報錯是由於tomcat記憶體溢位引起的:

[root@redmine logs]# ps -ef|grep tomcat
root     23615     1 14 15:15 ?        00:04:45 /usr/java/jdk1.7.0_79/bin/java -Djava.util.logging.config.file=/srv/apache-tomcat-7.0.67/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/srv/apache-tomcat-7.0.67/endorsed -classpath /srv/apache-tomcat-7.0.67/bin/bootstrap.jar:/srv/apache-tomcat-7.0.67/bin/tomcat-juli.jar -Dcatalina.base=/srv/apache-tomcat-7.0.67 -Dcatalina.home=/srv/apache-tomcat-7.0.67 -Djava.io.tmpdir=/srv/apache-tomcat-7.0.67/temp org.apache.catalina.startup.Bootstrap start
root     24191 24013  0 15:49 pts/6    00:00:00 grep tomcat

Tomcat預設可以使用的記憶體為128MB,在較大型的應用專案中,這點記憶體顯然是不夠的,從而有可能導致系統無法執行!
其中常見的記憶體問題是報Tomcat記憶體溢位錯誤,Out of Memory(系統記憶體不足)的異常,從而導致客戶端顯示500錯誤。
在生產環境中,tomcat記憶體設定不好很容易出現JVM記憶體溢,解決方法就是:修改Tomcat中的catalina.sh檔案(windows系統下修改的檔案時catalina.bat)。在catalina.sh檔案中,找到cygwin=false,在這一行的前面加入引數,具體如下:

[root@redmine bin]# pwd
/srv/apache-tomcat-7.0.67/bin
[root@redmine bin]# vim catalina.sh     //在cygwin=false這一行的上面新增下面內容
......
JAVA_OPTS='-Xms1024m -Xmx1024m -XX:PermSize=256M -XX:MaxNewSize=512m -XX:MaxPermSize=512m'
cygwin=false
......

其中,-Xms設定初始化記憶體大小,-Xmx設定可以使用的最大記憶體。一般把-Xms和-Xmx設為一樣大

最後重啟tomcat即可,重啟後檢視tomcat服務程式,就能看到記憶體資訊了:

[root@redmine bin]# ps -ef|grep tomcat|grep -v grep|awk -F" " '{print $2}'|xargs kill -9

[root@redmine bin]# /srv/apache-tomcat-7.0.67/bin/startup.sh 

[root@redmine bin]# ps -ef|grep tomcat
root     24547     1  3 15:53 pts/6    00:01:02 /usr/java/jdk1.7.0_79/bin/java -Djava.util.logging.config.file=/srv/apache-tomcat-7.0.67/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Xms1024m -Xmx1024m -XX:PermSize=256M -XX:MaxNewSize=512m -XX:MaxPermSize=512m -Djava.endorsed.dirs=/srv/apache-tomcat-7.0.67/endorsed -classpath /srv/apache-tomcat-7.0.67/bin/bootstrap.jar:/srv/apache-tomcat-7.0.67/bin/tomcat-juli.jar -Dcatalina.base=/srv/apache-tomcat-7.0.67 -Dcatalina.home=/srv/apache-tomcat-7.0.67 -Djava.io.tmpdir=/srv/apache-tomcat-7.0.67/temp org.apache.catalina.startup.Bootstrap start
root     24982 24013  0 16:22 pts/6    00:00:00 grep tomcat

--------------------------------------------------------------------------------------------------
tomcat常見的記憶體溢位問題有以下三種情況:
1)OutOfMemoryError: Java heap space
2)OutOfMemoryError: PermGen space
3)OutOfMemoryError: unable to create new native thread.
--------------------------------------------------------------------------------------------------
順便說下Tomcat連線數設定:
在tomcat配置檔案server.xml中的<Connector ... />配置中,和連線數相關的引數有:
minProcessors:         最小空閒連線執行緒數,用於提高系統處理效能,預設值為10
maxProcessors:        最大連線執行緒數,即:併發處理的最大請求數,預設值為75
maxThreads               最大併發執行緒數,即同時處理的任務個數,預設值是200
acceptCount:            允許的最大連線數,應大於等於maxProcessors,預設值為100
enableLookups:         是否反查域名,取值為:true或false。為了提高處理能力,應設定為false
connectionTimeout:    網路連線超時,單位:毫秒。設定為0表示永不超時,這樣設定有隱患的。通常可設定為30000毫秒。

其中和最大連線數相關的引數為maxProcessors和acceptCount如果要加大併發連線數,應同時加大這兩個引數。
web server允許的最大連線數還受制於作業系統的核心引數設定,通常Windows是2000個左右,Linux是1000個左右。Unix中如何設定這些引數,請參閱Unix常用監控和管理命令

例如

<Connector port="8888" protocol="HTTP/1.1" 
maxThreads="500" minSpareThreads="50" maxSpareThreads="100" enableLookups="false" acceptCount="2000" 
connectionTimeout="20000" 
redirectPort="8443" />

相關文章