2016-01-19 62 views
2

在tomcat运行了好几个月之后,我无意中发现了下面的错误。 我们重新启动了tomcat,错误现在不会出现,但可能会在未来再次出现。 我看到其他用户有类似的异常,与垃圾收集有关,但与NIO连接器没有完全相关。Tomcat崩溃,错误java.lang.OutOfMemoryError:超出GC开销限制

有人知道为什么会发生这种情况,应避免使用正确的修复方法。

Jan 15, 2016 7:46:47 AM org.apache.tomcat.util.net.NioEndpoint$SocketProcessor run 
SEVERE: 
java.lang.OutOfMemoryError: GC overhead limit exceeded 
     at java.util.Collections.synchronizedSet(Collections.java:1691) 
     at org.atmosphere.cpr.AtmosphereRequest$Builder.<init>(AtmosphereRequest.java:1146) 
     at org.atmosphere.cpr.AtmosphereRequest.wrap(AtmosphereRequest.java:1891) 
     at org.atmosphere.cpr.AtmosphereServlet.event(AtmosphereServlet.java:295) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilterEvent(ApplicationFilterChain.java:484) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilterEvent(ApplicationFilterChain.java:377) 
     at org.apache.catalina.core.StandardWrapperValve.event(StandardWrapperValve.java:411) 
     at org.apache.catalina.core.StandardContextValve.event(StandardContextValve.java:146) 
     at org.apache.catalina.valves.ValveBase.event(ValveBase.java:224) 
     at org.apache.catalina.core.StandardHostValve.event(StandardHostValve.java:256) 
     at org.apache.catalina.valves.ValveBase.event(ValveBase.java:224) 
     at org.apache.catalina.valves.ValveBase.event(ValveBase.java:224) 
     at org.apache.catalina.core.StandardEngineValve.event(StandardEngineValve.java:138) 
     at org.apache.catalina.connector.CoyoteAdapter.event(CoyoteAdapter.java:210) 
     at org.apache.coyote.http11.Http11NioProcessor.event(Http11NioProcessor.java:124) 
     at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585) 
     at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1690) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
     at java.lang.Thread.run(Thread.java:744) 

回答

2

您的服务器没有足够的内存来管理一些特别耗费内存的任务,或者您有内存泄漏。

  1. 对于第一种情况,你可能要更改的tomcat内存设置与-Xmx-Xms VM参数,见Java VM options

本主题示出了用于Tomcat的一个完整的例子:Increase Tomcat memory settings

  • 对于第二种情况,应创建一个heap dump,与jmap例如。
  • 堆转储文件表示java进程的当前堆分配。

    jmap -dump:file=<file-name> <process-id> 
    

    这里,<file-name>是要创建的文件,<process-id>的Tomcat进程的ID。

    一些工具,如Eclipse MAT,可以打开和分析堆转储文件,告诉你通过类对象的对象类型,内存泄漏嫌疑人的数量,占用的内存,等等...

    +0

    第二点我打算尝试,以发现问题。关于应用程序,它作为用户,活动等在出现问题的服务器上的负载非常低。所以我想标准内存设置应该足够了。 – Vesselin

    1

    OPTION 1个CATALINA .BAT

    如果您是从以下(Windows)中运行Tomcat:

    catalina.bat start 
    

    然后,你应该创建一个文件setenv.bat并添加以下行:

    set JAVA_OPTS="-Xms4096m -Xmx4096m" 
    

    OPTION 2 CATALINA.SH

    如果您是从以下(Linux)的运行Tomcat:

    catalina.sh start 
    

    然后,你将不得不做类似的事情,创造SETENV。SH添加类似以下内容:

    export JAVA_OPTS="-Xms4096m -Xmx4096m" 
    

    又见Increase Tomcat memory settings

    OPTION 3 Tomcat服务

    如果你是从使用Tomcat的安装程序安装的Windows服务运行Tomcat,转到Windows命令提示符并运行这样的事情(这是Tomcat的8,可以在像找到 “C:\ Program Files文件\ Apache软件基金会\ Tomcat的8.0 \ BIN”):

    Tomcat8w.exe 
    

    在Java选项卡下,您将看到初始内存池和最大内存池。输入这两个字段

    4096 
    

    单击应用并确定。

    从任务管理器,服务选项卡,服务,选择Tomcat和Apache按下启动

    参见Configure Tomcat as a service (no catalina.bat)https://plavc.wordpress.com/2012/02/08/tomcat-service-on-windows/

    +0

    Hi @Scott,如果我在Amazon ElastiC Beanstalk服务器上运行tomcat会怎么样?我得到同样的问题,我已经重新启动服务器,它的工作原理... – efirat

    相关问题