一个tomcat 中部署了三个工程后总是
OutOfMemoryError: PermGen space
一个tomcat 中部署了三个工程后总是OutOfMemoryError: PermGen space
启动无异常
catalina.bat文件增加了
set JAVA_OPTS=%JAVA_OPTS% -server -XX:PermSize=512m -XX:MaxPermSize=800m
但还是会
内存溢出
多个项目,应该如何部署?
用一个tomcat还是多个?
------解决方案--------------------永久保存区域溢出
PermGen space的全称是Permanent Generation space,是指内存的永久保存区域。这一部分用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域,它和和存放Instance的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误。这种错误常见在web服务器对JSP进行pre compile的时候。但目前的hibernate和spring项目中也很容易出现这样的问题。http://www.javaeye.com/topic/80620?page=1 的帖子有讨论的这个问题。可能是由于这些框架会动态class,而且jvm的gc是不会清理PemGen space的,导致内存溢出。
这一个一般是加大-XX:PermSize -XX:MaxPermSize 来解决问题。
-XX:PermSize 永久保存区域初始大小
-XX:PermSize 永久保存区域初始最大值
这一般结合第一条使用,比如 set JAVA_OPTS= -Xms1024m -Xmx1024m -XX:PermSize=128M -XX:PermSize=256M
有一点需要注意:java -Xmx***M version 命令来测试的最大堆内存是 -Xmx与 -XX:PermSize的 和 比如系统支持最大的jvm堆大小事1.5G,那 -Xmx1024m -XX:PermSize=768M 是无法运行的。
------解决方案--------------------问题是看你用那种方式启动了。。
如果是命令行运行catalina.bat启动的话,内存确实会修改。
但是如果直接当做一个服务来启动的话,你这个设置就不管用的,因为根本就没用运行catalina.bat这个文件。。
如果在Eclipse中的话
可以通过如下方式改一下:
Window->Preferences->Application Servers->Tomcat --->JDK--->
Optional Java VM Arguments
-Xms256m -Xmx636m
内存
------解决方案--------------------
PermGen space
这个区域是放你源代码的区域 JVM起来的时候会加载到这个区。
你3个项目的代码量超过这个区就爆了。
------解决方案--------------------看看是不是有大对象没有GC,或者加内存、开其他服务器。菜鸟只见
------解决方案--------------------前阵子也遇到这个问题了,谢谢分享