生产错误:“超出GC开销限制”[重复]

问题描述 投票:-1回答:1

这个问题在这里已有答案:

我需要一个提示或者一个工具,试图获得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"
'

(它的localhost,因为它在SSH中)。

在这两种情况下,它都显示错误500。

下面是日志,开始生产:

错误:

Caused by:

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) at java.lang.Thread.run(Thread.java:748)引起:java.lang.OutOfMemoryError:超出GC开销限制

对于迄今为止尚未阅读的文章,一切都有帮助,甚至是评论。

java garbage-collection jvm apache-karaf
1个回答
0
投票

这个短语的第一个谷歌搜索似乎是相当丰富的信息 - https://plumbr.io/outofmemoryerror/gc-overhead-limit-exceeded

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

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

© www.soinside.com 2019 - 2024. All rights reserved.