首先必须要检查你的程序,因为出现这种情况基本都是程序的问题。
然后你可以适当把tomcat的内存调大一点。

解决方案 »

  1.   

    呵呵,tomcat内存基本上调到最到(1.8G)了,如果是程序的问题,但是gc能比较正常的回收垃圾啊,gc报告里提示堆的使用内存才不过300M而已哦,难道GC的日志不准确?
      如果真的是程序的问题,那一般有哪些问题会导致内存消耗完毕呢?
      假如一个没有问题的页面程序和网站,在大量用户和一定时间的访问后,tomcat会不会还是累积占用系统内存从而出现问题呢?
      

  2.   

    我也有同样的问题,gc日志正常,但linux的可用内存不断减少,不过我用的是resin3.0.8,
      

  3.   

    >gc日志正常,但linux的可用内存不断减少 
    说明程序中无用的引用未释放,所以要查程序
      

  4.   

    引用不是出了作用范围就自动释放了吗?
    程序里也没有用静态变量引用对象。所以应该不存在对无用对象的引用。项目在线人数在1000左右时是正常的,现在在线人数有2000多,resin就会有时1天,有时两三天出现内存回收不了的情况,出现这种情况的时候,jvm不断地执行full gc,整个应用就基本动不了了。
      

  5.   

    If you are using database, check if you close resultset or statement after you finish a query.
      

  6.   

    >但是你能确定所有的无用引用都出了作用范围么?
    servlet里面没有定义类属性,其他的业务bean都不是单例的,也没有静态属性。在servlet方法调用的业务bean,所以认为所有引用都出了作用范围>If you are using database, check if you close resultset or statement after you finish a query.
    这部分重点检查过,使用了链接池,所有的resultset和statement都关了,不过statement对象池里的对象没有重用,每次数据库操作都新建了一个statement,所以建statement的频率比较高,不过都有关闭的,而且不是简单地返回给链接池。现在准备改成重用statement对象池里的statement,看看是否有改善。实在没招了,任何有可能的方法都不放过
      

  7.   

    can you make sure the resultsets and statements are closed when exceptions happened?
      

  8.   

    问题分析:   由于TOMCAT内存溢出而引发的问题,主要原因是JVM的虚拟内存默认为128M,当超过这个值时就把先前占用的内存释放,而导致好象TCP/IP丢包的假象,出现HTTP500的错误。  
          解决方法主要是加大TOMCAT可利用内存,并在程序当中加大内存使用。解决方法:方法:加大TOMCAT可利用内存:
      在TOMCAT的目录下,也就是在TOMCAT41/bin/catalina.bat文件最前面加入
      set JAVA_OPTS=-Xms800m -Xmx800m
      表现效果是当你启动TOMCAT时,系统内存会增加近800M使用
    操作方法:
      1)、先关掉WINDOWS服务当中的TOMCAT4服务。
      2)、再找到TOMCAT/BIN目录下startup.bat,双击打开它,你会发现现WINDOWS内存占用会增加近800M。
      3)、执行程序,因为是TOMCAT重新编译程序,所以第一次会比较慢。结论:经过测试,我们得出如下数据:当系统传输约2000条数据时,大约近12M的净数据(不压缩时),系统辅助运行的内存大约占用150M左右的空间,也就是近200M的内存占用,而我们扩大了近800M的JAVA内存使用,这对于业务本身来说是足够了。所以你们不用担心大数据量的传递问题。基于JAVA虚拟机的原理,JAVA自动有垃圾回收机制,也就是在你对一些内存长时间不使用时(近2分钟,取决于使用频度和优先级等),就会自动垃圾回收,从而释放不用的内存占用。