Tomcat崩溃,显示错误java.lang.OutOfMemoryError: GC overhead limit exceeded。

9

在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)
2个回答

9

选项1:CATALINA.BAT

如果您正在从以下位置(Windows)运行Tomcat:


请注意:保留HTML标记,不提供解释。
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"

请见增加Tomcat内存设置

选项3 Tomcat服务

如果你是通过安装Tomcat安装程序来运行Tomcat的Windows服务,那么请前往Windows命令提示符并运行以下命令(以下是适用于Tomcat 8的示例,可以在类似C:\Program Files\Apache Software Foundation\Tomcat 8.0\bin中找到):

Tomcat8w.exe

Java 选项卡下,您将看到 Initial memory poolMaximum memory pool。在这两个字段中输入以下内容:

4096

点击 应用确定

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

另请参阅 将Tomcat配置为服务(无catalina.bat)https://plavc.wordpress.com/2012/02/08/tomcat-service-on-windows/


嗨@Scott,如果我在Amazon ElastiC Beanstalk服务器上运行tomcat会怎样?我遇到了同样的问题,我已经重新启动了服务器,现在它可以工作了... - efirat
嗨,Scott,你真是个救星。你不知道有多感激。非常感谢。 - Shubham Arya

6

你的服务器可能因为某些内存占用过大的任务而没有足够的内存来管理,或者存在内存泄漏。

  1. 对于第一种情况,您可以使用 -Xmx-Xms VM 参数更改 tomcat 的内存设置,详见Java VM 选项

本主题提供了一个完整的 Tomcat 示例:增加 Tomcat 内存设置

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

堆转储文件代表 Java 进程的当前堆分配。

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

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

一些工具例如Eclipse MAT,能够打开并分析堆转储文件,告诉你每种对象的数量,不同类型对象所占用的内存,内存泄漏的嫌疑等等......


我计划尝试第二个点以便检测问题。关于应用程序,在出现问题的服务器上,它的用户、活动等负载非常低。因此,我认为标准内存设置应该足够了。 - Vesselin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接