tomcat:java.lang.OutOfMemoryError: Java heap space 的调试

最近隔壁项目组遇到了一个问题,一个基于SSH2框架的普通javaweb项目在调试环境没有出现过问题,一旦放到演示机上面,点击某查询操作密集的功能按钮就会出现java.lang.OutOfMemoryError: Java heap space错误。最后调试任务落到我这里,为了解决这一问题,查询一些资料,也做了一些相关的尝试。在此做一下记录。

演示机与开发机环境介绍

项目 开发机 演示机
CPU i3 i5
内存 8G 8G
JDK 64位1.6 64位1.6
Tomcat 64位6.0 64位6.0

调试过程

  • 初步猜测是由于JAVA的堆栈设置太小
    • 对应方案 :于是在apache-tomcat-6.0.18/bin/catalina.bat最前面加入:set JAVA_OPTS=-Xms2048m - Xmx2048m,将JVM的堆空间增大
    • 结果:没有解决
  • 然后认为可能存在内存泄漏
    • 对应方案 :在myeclipse中设置启动参数,转储内存溢出时的快照dump文件。进行代码检查,看能够优化过程。
    • 结果:演示机上安装IDE,进入开发调试过程之后,问题不在复现,由myeclipse启动tomcat,没有任何问题。但是单独启动tomcat则问题依旧。
  • 发现JVM默认的堆内存上限为物理内存的四分之一,猜测可能是由于演示机内存较大,64位下JVM的GC机制比32位下的效率要低,所以64位JVM的GC机制可能在内存过大时不能很好的运作。
    • 对应方案:apache-tomcat-6.0.18/bin/catalina.bat最前面加入 set JAVA_OPTS=-server -Xms800m -Xmx800m -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m -Djava.awt.headless=true
    • 结果:问题解决

发表评论

电子邮件地址不会被公开。 必填项已用*标注