在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路径中时,我遇到了异常。
答案 0 :(得分:1)
增加堆大小是必须的。您可以创建或编辑$ CATALINA_HOME / bin / setenv.sh,添加以下行:
JAVA_OPTS="-Xms1024m -Xmx2048m"
然后重启tomcat。我认为解压war文件并将其复制到$ CATALINA_HOME / webapps更好,而且,在生产中使用热部署并不是一个好主意。
答案 1 :(得分:0)
在我的情况下,如果我部署我的应用程序而不重新启动tomcat ,则会发生这种情况。我认为GC(垃圾收集器)在释放分配的内存方面存在一些问题。
我的解决方法是:
答案 2 :(得分:0)
这在Java世界中很常见,实际上仍然可能会影响JRuby ...虽然如果您使用最新的> = 1.7.15并使用jruby-openssl> =,这些天的热部署会更顺畅0.9.5。但是仍然可能有宝石/库会重新加载问题,因此会泄漏内存(一个这样的库是require 'timeout'
)所以你需要检查堆转储以寻找泄漏候选者。同样,Tomcat通常会打印与"潜在"相关的有用提示。在解除/重新部署期间泄漏候选人。
现在,有些事情需要确定。如果您使用Java 6,则需要使用并发(标记和清除)GC,因为其他人不会交换堆空间而且它不是默认值,即使这样您也需要增加堆如果您正在计划热重新加载,则需要能够容纳两次应用程序(Java)类。