Tomcat服务器无响应 "http-nio-80-Acceptor-0"

我有一个5GB内存的spring boot(1.5.8.RELEASE)应用。当我使用API请求返回巨大的数据时,它抛出的是

> Apr 30, 2020 2:01:34 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Handler dispatch failed; nested exception is java.lang.OutOfMemoryError: GC overhead limit exceeded] with root cause

上述异常是预料之中的,因为数据量很大,应用程序正在耗尽内存。但是,如果我用同样的请求点击API,返回巨大的数据,我的应用程序就会抛出以下异常,应用程序变得无响应,我每次都需要重新启动它。但如果我再次用返回较少数据量的请求来调用API,它就能完美地工作。

Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "http-nio-80-Acceptor-0"
Exception in thread "ContainerBackgroundProcessor[StandardEngine[Tomcat]]" java.lang.OutOfMemoryError: GC overhead limit exceeded
Apr 30, 2020 2:09:22 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Handler dispatch failed; nested exception is java.lang.OutOfMemoryError: GC overhead limit exceeded] with root cause
java.lang.OutOfMemoryError: GC overhead limit exceeded

为什么同一个请求会抛出不同的异常?我用VisualVm分析了内存,在处理完请求后,内存立即被清除,我已经确定没有内存泄漏。这是否与 org.apache.tomcat.jdbc.pool.DataSource() 我使用的是什么?

解决方案:

你得到这个错误。 java.lang.OutOfMemoryError: GC overhead limit exceeded

当JVM花了太多时间执行垃圾回收,只能回收很少的堆空间时,就会出现这个错误。

根据Java文档,默认情况下,如果Java进程花了超过98%的时间来做GC,并且每次运行中只回收了不到2%的堆空间,JVM就会被配置成抛出这个错误。换句话说,这意味着我们的应用程序几乎耗尽了所有的可用内存,而垃圾回收器花了太多的时间去清理内存,并且屡次失败了。

解决方法:增加堆的大小,比如-Xmx1g。

  • 增加堆的大小,例如-Xmx1g。
  • 可以通过在命令行添加选项-XX:-UseGCOverheadLimit来禁用限制检查。

你可以在tomcatbinsetenv.sh文件中设置jvm环境配置,像这样。

CATALINA_OPTS="-Djava.awt.headless=true -Xms2048m -Xmx2048m  -XX:-UseGCOverheadLimit"

给TA打赏
共{{data.count}}人
人已打赏
未分类

C#定时器的启动和停止

2022-9-23 11:22:48

未分类

在useState钩子中把一个状态和另一个状态关联起来。

2022-9-23 11:22:58

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索