java.lang.OutOfMemoryError:在Tomcat 7上部署.war的Java堆空间

时间:2014-11-05 13:40:07

标签: java tomcat heap jruby war

在tomcat7(Ubuntu)中运行war文件时出现以下错误:

Exception in thread "http-bio-8080-AsyncTimeout" java.lang.OutOfMemoryError: Java heap space
    at java.util.concurrent.ConcurrentLinkedQueue.iterator(ConcurrentLinkedQueue.java:667)
    at org.apache.tomcat.util.net.JIoEndpoint$AsyncTimeout.run(JIoEndpoint.java:156)
    at java.lang.Thread.run(Thread.java:745)

当我将app.war文件放在webapps路径中时,我遇到了异常。

3 个答案:

答案 0 :(得分:1)

增加堆大小是必须的。您可以创建或编辑$ CATALINA_HOME / bin / setenv.sh,添加以下行:

JAVA_OPTS="-Xms1024m -Xmx2048m"

然后重启tomcat。我认为解压war文件并将其复制到$ CATALINA_HOME / webapps更好,而且,在生产中使用热部署并不是一个好主意。

答案 1 :(得分:0)

在我的情况下,如果我部署我的应用程序而不重新启动tomcat ,则会发生这种情况。我认为GC(垃圾收集器)在释放分配的内存方面存在一些问题。

我的解决方法是:

  • 只需删除war文件
  • 即可
  • 等待一段时间,直到您的应用程序文件夹被tomcat删除
  • 停止服务器
  • 上传war文件
  • 最后再次启动你的tomcat实例。

答案 2 :(得分:0)

这在Java世界中很常见,实际上仍然可能会影响JRuby ...虽然如果您使用最新的> = 1.7.15并使用jruby-openssl> =,这些天的热部署会更顺畅0.9.5。但是仍然可能有宝石/库会重新加载问题,因此会泄漏内存(一个这样的库是require 'timeout')所以你需要检查堆转储以寻找泄漏候选者。同样,Tomcat通常会打印与"潜在"相关的有用提示。在解除/重新部署期间泄漏候选人。

现在,有些事情需要确定。如果您使用Java 6,则需要使用并发(标记和清除)GC,因为其他人不会交换堆空间而且它不是默认值,即使这样您也需要增加堆如果您正在计划热重新加载,则需要能够容纳两次应用程序(Java)类。