日期:2014-05-18  浏览次数:20856 次

一个tomcat 中部署了三个工程后总是OutOfMemoryError: PermGen space
一个tomcat 中部署了三个工程后总是OutOfMemoryError: PermGen space

启动无异常

catalina.bat文件增加了
set JAVA_OPTS=%JAVA_OPTS% -server -XX:PermSize=512m -XX:MaxPermSize=800m

但还是会内存溢出

多个项目,应该如何部署?

用一个tomcat还是多个?
tomcat outofmemoryerror java 内存溢出 多个项目如何部署

------解决方案--------------------
永久保存区域溢出 
 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 
内存

------解决方案--------------------
引用:
一个tomcat 中部署了三个工程后总是OutOfMemoryError: PermGen space

启动无异常

catalina.bat文件增加了
set JAVA_OPTS=%JAVA_OPTS% -server -XX:PermSize=512m -XX:MaxPermSize=800m

但还是会内存溢出

多个项目,应该如何部署?

用一个tomcat还是多个?


PermGen space

这个区域是放你源代码的区域 JVM起来的时候会加载到这个区。

你3个项目的代码量超过这个区就爆了。
------解决方案--------------------
看看是不是有大对象没有GC,或者加内存、开其他服务器。菜鸟只见
------解决方案--------------------
前阵子也遇到这个问题了,谢谢分享