【问题标题】:Error in production: "GC overhead limit exceeded" [duplicate]生产中的错误:“超出 GC 开销限制”[重复]
【发布时间】:2019-04-08 13:55:53
【问题描述】:

我需要一个提示或者一个工具来尝试优化 80.000 条记录。这个问题最重要的是试图理解一种模拟方式,因为问题是在生产中,我没有,或者更好的说,到目前为止,还没有一个特定的工具用于构建在 OSGI 框架中的应用程序,Java。

更准确地说,如果有其他方法,除了:

export JAVA_MIN_MEM=256M # Minimum memory for the JVM export JAVA_MAX_MEM=1024M # Maximum memory for the JVM export JAVA_PERM_MEM=128M # Minimum perm memory for the JVM export JAVA_MAX_PERM_MEM=256M # Maximum memory for the JVM

以下是两个调用的示例形式:

curl -X POST 
http://localhost:8182/cxf/rest/ped/v1/terminals/shops 
 -H 'Content-Type: application/json' 
 -H 'Postman-Token: 743b0fdb-9df9-4751-ad8c-b0f7a4f96e87' 
 -H 'cache-control: no-cache' 
 -d '{
 "correlationId": "1cb67b93-783e-48e3-9820-bd936ca14df0",
 "terminalId": "0",
 "includeServiceDetail": "0"
'

curl -X POST 
http://localhost:8182/cxf/rest/ped/v1/terminals/shops 
 -H 'Content-Type: application/json' 
 -H 'Postman-Token: e29a3956-16e7-496d-af81-f5b424c41d4c' 
 -H 'cache-control: no-cache' 
 -d '{
 "correlationId": "5c62e30a-baff-469a-993f-429559979e7a",
 "includeServiceDetail": "0"
'

(它的本地主机,因为它在 SSH 中)。

在这两种情况下都会出现错误 500。

以下是日志,进入生产环境:

错误:

原因:

org.apache.cxf.interceptor.Fault:超出 GC 开销限制
在 org.apache.cxf.service.invoker.AbstractInvoker.createFault(AbstractInvoker.java:162)
在 org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:128)
在 org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:193)
在 org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:103) ...
在 org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:589)
在 java.lang.Thread.run(Thread.java:748) 原因:java.lang.OutOfMemoryError: GC overhead limit exceeded`

对一篇到现在还没有读过的文章,一切都有帮助,甚至是评论。

【问题讨论】:

    标签: java garbage-collection jvm apache-karaf


    【解决方案1】:

    该短语的第一个谷歌搜索似乎非常有用 - https://plumbr.io/outofmemoryerror/gc-overhead-limit-exceeded

    基本上,您的 Java 服务器进程有一定数量的内存可以使用 - 每次创建对象时,通过调用 new ...,都会使用一些内存。当 Java 开始内存不足时,有一个称为垃圾收集器的后台任务,它识别哪些对象不再需要,并释放该内存以便可以重用。您收到的特定错误消息意味着垃圾收集器无法回收足够的内存让您的程序继续运行。

    如果您对 Java 服务器进程的运行方式有足够的了解,则可以首先尝试增加分配给它使用的内存(堆)的大小。如果你通过命令行运行它,你可以将-Xmx 参数传递给java 程序,让它的大小大于默认值(所以试试-Xmx1G 之类的东西开始)。如果您通过某个应用程序容器(例如 Tomcat)运行,您需要找到包含传递给 java 的命令的配置文件并将其设置在那里。

    【讨论】:

      猜你喜欢
      • 2016-10-23
      • 2011-08-15
      • 2010-11-26
      • 1970-01-01
      • 2018-04-10
      • 2021-01-07
      • 2017-11-12
      相关资源
      最近更新 更多