最近集群服務器中的幾台服務器在半夜自動重啟tomcat后一段時間便都會報java.lang.OutOfMemoryError: PermGen space。
習慣性的百度,得到的答案基本上都是統一的解決辦法:
手動設置MaxPermSize大小修改TOMCAT_HOME/bin/catalina.sh 在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行: JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128m
可是這段代碼已經在TOMCAT_HOME/bin/catalina.sh添加進去了(如下圖),它還是依舊報的這個錯誤
經過對比正常的服務器的配置和catalina.sh的配置,終於發現了問題:
從上圖我們可以看到,
“echo "Using CATALINA_BASE: $CATALINA_BASE"
這一行,以及新加入的
JAVA_OPTS="$JAVA_OPTS -server -Xms1024m -Xmx1024m -XX:PermSize=10240m -XX:MaxPermSize=20480m"
這一行是在一個if語句里面,if語句上面有它的注釋
# Bugzilla 37848: only output this if we have a TTY
所以說當沒有TTY的時候if里面的語句是不會執行的,也就是說,問題可能就出現在這里。
通過ps aux|grep tomcat命令后發現TTY那一列輸出的是?,也就是說沒有TTY,后面也沒有打印出自定義的內存大小的信息,所以很明顯if里面的語句沒有執行到,還是默認的大小,所以java.lang.OutOfMemoryError: PermGen space
所以把加大內存配置的代碼放在其它地方,然后修改一下系統時間,讓tomcat重啟一下,再通過ps aux|grep tomcat命令查看,啟動參數已經有了修改的內存配置...一段時間后,tomcat也沒有溢出,問題應該是解決了...
Reference:
[1] http://blog.csdn.net/userwyh/article/details/44563233