今天在部署項(xiàng)目時(shí)發(fā)現(xiàn)服務(wù)啟動(dòng)了卻無法訪問,查看了log了的日志酱畅,發(fā)現(xiàn)報(bào)了out of memory PerGem space異常琳袄。
先看看什么是PerGem 異常:
tomcat中java.lang.OutOfMemoryError: PermGen space異常處理
PermGen space的全稱是Permanent Generation space,是指內(nèi)存的永久保存區(qū)域,這塊內(nèi)存主要是被JVM存放Class和Meta信息的,Class在被Loader時(shí)就會(huì)被放到PermGen space中, 它和存放類實(shí)例(Instance)的Heap區(qū)域不同,GC(Garbage Collection)不會(huì)在主程序運(yùn)行期對(duì)PermGen space進(jìn)行清理,所以如果你的應(yīng)用中有很多CLASS的話,就很可能出現(xiàn)PermGen space錯(cuò)誤, 這種錯(cuò)誤常見在web服務(wù)器對(duì)JSP進(jìn)行pre compile的時(shí)候纺酸。如果你的WEB APP下都用了大量的第三方j(luò)ar, 其大小超過了jvm默認(rèn)的大小(4M)那么就會(huì)產(chǎn)生此錯(cuò)誤信息了窖逗。 解決方法: 手動(dòng)設(shè)置MaxPermSize大小修改TOMCAT_HOME/bin/catalina.sh在
echo "Using CATALINA_BASE: $CATALINA_BASE"
上面加入以下行:
JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128m
建議:將相同的第三方j(luò)ar文件移置到tomcat/shared/lib目錄下,這樣可以達(dá)到減少jar 文檔重復(fù)占用內(nèi)存的目的吁峻。
引用地址
雖說這里面的內(nèi)容我有些不明白滑负,有些也有疑問,但知道以下三點(diǎn)即可:
- PermGen內(nèi)存是用來存放Class和Meta信息的
- Class在被Load時(shí)會(huì)放到此內(nèi)存中
- GC不會(huì)在主程序運(yùn)行時(shí)對(duì)PermGen 進(jìn)行清理用含。
使用catalina.sh run運(yùn)行程序,發(fā)現(xiàn)服務(wù)隔段時(shí)間就會(huì)reload帮匾,查看了server.xml的配置啄骇,發(fā)現(xiàn)服務(wù)對(duì)應(yīng)的context有reloadable="true"這個(gè)參數(shù),那么再來看下這個(gè)參數(shù)是什么意思.
reloadable:如果這個(gè)屬性設(shè)為true瘟斜,tomcat服務(wù)器在運(yùn)行狀態(tài)下會(huì)監(jiān)視在WEB-INF/classes和WEB-INF/lib目錄下class文件的改動(dòng)缸夹,如果監(jiān)測(cè)到有class文件被更新的痪寻,服務(wù)器會(huì)自動(dòng)重新加載Web應(yīng)用。
Tomcat6.0官方文檔是這么說的
Set to true if you want Catalina to monitor classes in /WEB-INF/classes/ and /WEB-INF/lib
for changes, and automatically reload the web application if a change is detected. This feature is very useful during application development, but it requires significant runtime overhead and is not recommended for use on deployed production applications. That's why the default setting for this attribute is false. You can use the Manager web application, however, to trigger reloads of deployed applications on demand.
文檔上的說明是僅僅監(jiān)聽class文件虽惭,可是我的class文件并沒有變啊橡类,倒是里面有一個(gè)db文件啟動(dòng)的時(shí)候會(huì)變化。 雖說將reloadable="true"改為false可以了芽唇,還是沒有搞明白具體是怎么回事顾画,我總覺得不僅僅是監(jiān)聽class文件。明天再看吧