【问题标题】:Tomcat crashes with error java.lang.OutOfMemoryError: GC overhead limit exceededTomcat 因错误 java.lang.OutOfMemoryError 崩溃:超出 GC 开销限制
【发布时间】:2016-04-25 05:42:50
【问题描述】:

tomcat跑了几个月后,没想到出现下面的错误。 我们重新启动了tomcat,现在没有出现错误,但将来可能会再次出现。 我看到其他用户也有类似的异常,与垃圾收集有关,但与 NIO 连接器不完全相关。

有人知道为什么会发生这种情况以及应该采取什么正确的解决方法来避免这种情况。

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)

【问题讨论】:

    标签: java tomcat garbage-collection atmosphere


    【解决方案1】:

    选项 1 CATALINA.BAT

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

    catalina.bat start
    

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

    set JAVA_OPTS="-Xms4096m -Xmx4096m"
    

    选项 2 CATALINA.SH

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

    catalina.sh start
    

    然后,您将不得不做类似的事情并创建 setenv.sh 添加如下内容:

    export JAVA_OPTS="-Xms4096m -Xmx4096m"
    

    另见Increase Tomcat memory settings

    选项 3 TOMCAT 服务

    如果您从使用 Tomcat 安装程序安装的 Windows 服务运行 Tomcat,请转到 Windows 命令提示符并运行类似这样的内容(这是针对 Tomcat 8 的,可以在类似 C:\Program Files\Apache Software Foundation\Tomcat 8.0\bin 的内容中找到):

    Tomcat8w.exe
    

    Java 标签下,您将看到Initial memory poolMaximum memory pool。在两个字段中输入:

    4096
    

    点击ApplyOK

    Task ManagerServices 选项卡、Services,选择Apache Tomcat 并按start

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

    【讨论】:

    • 嗨@Scott,如果我在Amazon ElastiC Beanstalk 服务器上运行tomcat 会怎样?我遇到了同样的问题,我已经重新启动服务器并且它可以工作......
    • 嗨斯科特,你真是个救世主。你不知道。非常感谢。
    【解决方案2】:

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

    1. 对于第一种情况,您可能希望使用-Xmx-Xms VM 参数更改tomcat 的内存设置,请参阅Java VM options

    本主题展示了 Tomcat 的完整示例:Increase Tomcat memory settings

    1. 对于第二种情况,您应该创建一个heap dump,例如jmap

    堆转储文件表示 java 进程的当前堆分配。

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

    这里&lt;file-name&gt;是你要创建的文件,&lt;process-id&gt;Tomcat进程的id。

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

    【讨论】:

    • 第二点我打算试一试,以便发现问题。关于应用程序,它在出现问题的服务器上作为用户、活动等的负载非常低。所以我想标准的内存设置应该足够了。
    猜你喜欢
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    • 2021-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-27
    相关资源
    最近更新 更多