問題說明:
公司內網環境中部署的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" />