今天在部署项目时发现服务启动了却无法访问,查看了log了的日志,发现报了out of memory PerGem space异常。
先看看什么是PerGem 异常:
tomcat中java.lang.OutOfMemoryError: PermGen space异常处理
PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中, 它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的应用中有很多CLASS的话,就很可能出现PermGen space错误, 这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。 解决方法: 手动设置MaxPermSize大小修改TOMCAT_HOME/bin/catalina.sh在
echo "Using CATALINA_BASE: $CATALINA_BASE"
上面加入以下行:
JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128m
建议:将相同的第三方jar文件移置到tomcat/shared/lib目录下,这样可以达到减少jar 文档重复占用内存的目的。
引用地址
虽说这里面的内容我有些不明白,有些也有疑问,但知道以下三点即可:
- PermGen内存是用来存放Class和Meta信息的
- Class在被Load时会放到此内存中
- GC不会在主程序运行时对PermGen 进行清理。
使用catalina.sh run运行程序,发现服务隔段时间就会reload,查看了server.xml的配置,发现服务对应的context有reloadable="true"这个参数,那么再来看下这个参数是什么意思.
reloadable:如果这个属性设为true,tomcat服务器在运行状态下会监视在WEB-INF/classes和WEB-INF/lib目录下class文件的改动,如果监测到有class文件被更新的,服务器会自动重新加载Web应用。
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.
文档上的说明是仅仅监听class文件,可是我的class文件并没有变啊,倒是里面有一个db文件启动的时候会变化。 虽说将reloadable="true"改为false可以了,还是没有搞明白具体是怎么回事,我总觉得不仅仅是监听class文件。明天再看吧