昨天客戶的系統又down了,打開log文件查看是由于OutOfMemory PermGen引起的。
回想前段時間也發生過同樣的情況,當時已經在catalina.bat文件中java_opts項中設置了-XX:MaxPermSize=256m;選項。將原來的64M調整為256M,為什么還會因為Perm區過小導致OutOfMemory呢?是不是我的設置沒有生效。由于我的tomcat是安裝在windows平臺上,而且是已service的方式啟動,所有修改了catalina文件并不會生效。google搜索一把,發現service方式的參數需要在tomcat5W.exe文件中設置。
于是,我打開此文件,在java_opts選項中增加了-XX:MaxPermSize=256m;選項。啟動tomcat,window提示服務不能正常啟動,faint!將剛才增加的選項去掉。啟動正常,暈。
再次google,發現需要將選項-XX:MaxPermSize=256m改為-DXX:MaxPermSize=256m,為什么?我也不清楚。照做先,再次啟動服務,Ok。啟動正常。
接下來需要做的就是驗證perm區是否是256M。
另外,在java_opts選項中增加了-XX:+PrintGCDetails選項。希望打印gc的信息。
由于web服務器是2CPU,而默認的回收策略比較適合單CPU的服務器,因此,接下來還要做的一件事就是改變回收策略。在java_opts選項中增加-XX:+UseConcMarkSweepGC參數即可。