最近一个大项目,是由三十多个小项目组成,项目开发采用struts+hibernate3.1
项目前期,大概十个项目左右,tomcat运行良好
昨天加入十个左右项目时,tomcat报错:java.lang.OutOfMemoryError: PermGen space
在网上找到一些方法:
1.升级cglib(无效)
2.共用相同的JAR(无明显效果)
3.设置内存参数。(都设置到1G了,无明显效果)想知道各位有什么好的意见!

解决方案 »

  1.   

    java.lang.OutOfMemoryError: PermGen space 这个是代码区满了。不是堆内存。
    加上这个参数看看
     -XX:MaxPermSize=256m 还有,不要经常的deploy你的项目,因为每次deploy都会占用这个区域。参考这个文章看看 
    http://www.java2000.net/viewthread.jsp?tid=5691http://www.java2000.net/viewthread.jsp?tid=4944
      

  2.   

    另外,建议你启用你的tomcat的jconsole监控功能,可以时刻观察系统的运行情况。请参考http://www.java2000.net/viewthread.jsp?tid=178
      

  3.   

    一,PermGen space的全称是Permanent Generation space,是指内存的永久保存区域OutOfMemoryError: PermGen space从表面上看就是内存益出,解决方法也一定是加大内存。说说为什么会内存益出:这一部分用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域,它和和存放Instance的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误。这种错误常见在web服务器对JSP进行pre compile的时候。
    改正方法:-Xms256m -Xmx256m -XX:MaxNewSize=256m -XX:MaxPermSize=256m 
    二、在tomcat中redeploy时出现outofmemory的错误.
    可以有以下几个方面的原因:
    1,使用了proxool,因为proxool内部包含了一个老版本的cglib.
    2, log4j,最好不用,只用common-logging
    3, 老版本的cglib,快点更新到最新版。
    4,更新到最新的hibernate3.2三、实例,以下给出1G内存环境下java jvm 的参数设置参考:
    JAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m -Djava.awt.headless=true "
      

  4.   

    另外建议:
    有问题多从自己程序入手,多看看java的DOC文档
    并详细了解JVM的知识。这样开发的程序才会健壮。
      

  5.   

     -XX:MaxPermSize=256m  这个参数已经设置为1024M,没有明显效果。。deploy和reload都已设置为false.
    hibernate我用的3.1版本,升到3.2会很麻烦
      

  6.   

    使用了proxool,因为proxool内部包含了一个老版本的cglib.我把我的连接池全部换成hibernate自身的连接池,问题依旧
      

  7.   

    去掉所有定时器,tomcat启动正常,
    访问每个项目上的测试页面1(没有访问数据库),正常
    访问每个项目上的测试页面2(访问数据库),前二十个左右项目正常,然后出现同样的异常
    如是怀疑是连接池问题:
    如是采用hibernate,proxool,c3p0数据连接池测试,无明显效果前十个项目运行了近半年,非常稳定
      

  8.   

    现在老板只肯拿出一台服务器,实在没办法只的考虑启动tomcat多实例了。
    有好的建议请跟贴,万分感谢!
      

  9.   

    楼主可以考虑合并你的应用了,减少war的个数。
      

  10.   

    昨天晚上睡觉又想了一晚上,明明是报PermSize不足,我增加PermSize不是就可以了,我明明增加了的,是不是没起到做用?
    早上过来测试,把PermSize的值分别调到12-24与256-512效果一样。。
    PermSize设置没启作用,如果是这样我也认了也许问题可以很快解决。
    我用的tomcat版本是6.0
    下个5.5的继续测试
      

  11.   

    tomcat5.5下面测试效果明显:
    将PermSize值设置为10-20项目报错
    将PermSize值设置为128-256项目运行正常
    可见在tomcat6下面设置的参数没起到做用,害得我瞎整了两天。。不过学到很多东西感谢各位的参与,此贴先不结,等项目到服务器上测试成功后结贴。
    再次感谢!!!
      

  12.   

    楼上的兄弟,因为你这句话我又测试了一次
    采用5.5可以解决问题,如果你用5.5时还出现那种问题,那么你可能是把5.5安装成服务从服务启动的。你看一下从服务启动时是运行的哪一个文件,tomcat5.exe是不是?好象运行这个文件并不会加载对PermSize的配置,我从服务启动进行测试就会出问题。使用startup.bat启动,我把startup.bat设置成启动任务,随系统启动。测试是成功的。
      

  13.   

    定时器完全可以独立成一个Application来运行,我是我一直的建议,定时器这东西会时不时地给你的应用添麻烦的。而且独立为一个Application是相当简单的。成本也底,而且很方便进行分离与维护。