昨天客户的系统又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参数即可。