一个tomcat 中部署了三个工程后总是OutOfMemoryError: PermGen space启动无异常catalina.bat文件增加了
set JAVA_OPTS=%JAVA_OPTS% -server -XX:PermSize=512m -XX:MaxPermSize=800m但还是会内存溢出多个项目,应该如何部署?用一个tomcat还是多个?tomcatoutofmemoryerrorjava内存溢出多个项目如何部署

解决方案 »

  1.   

    永久保存区域溢出 
     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 是无法运行的。
      

  2.   

    问题是看你用那种方式启动了。。
    如果是命令行运行catalina.bat启动的话,内存确实会修改。
    但是如果直接当做一个服务来启动的话,你这个设置就不管用的,因为根本就没用运行catalina.bat这个文件。。如果在Eclipse中的话
    可以通过如下方式改一下:
    Window->Preferences->Application Servers->Tomcat --->JDK--->Optional Java VM Arguments-Xms256m -Xmx636m 
    内存
      

  3.   


    PermGen space这个区域是放你源代码的区域 JVM起来的时候会加载到这个区。你3个项目的代码量超过这个区就爆了。
      

  4.   


    直接tomcat7.exe 启动的,未使用eclipse,是部署在外网服务器的,像这种多个项目部署在同一台服务器上,一般是如何部署?一个tomcat应该怎么做?
    使用二个tomcat应该怎么做?
    关键是要保证不会内存溢出!
    具体方式,我会,就是不知道如何避免内存溢出这个问题
      

  5.   


    设置了,没用啊!
    我试过使用两个tomcat来分别部署,但在外网服务器同时启动两个tomcat“有时”会出现问题!比如,问题一:当第一个tomcat启动成功后,启动第二个tomcat会在启动成功之前自动关闭了启动窗口!
          问题二:当两个都启动成功之后,一段时间后,第一个tomcat出现了线程被占用的异常。不是程序的问题