Java.lang.OutOfMemory: GC Overhead limit exceeded与java.lang.OutOfMemory: Multicast listener有何区别?

3

我正在调查我们应用程序的缓慢和集群环境中一个实例崩溃的问题。几周前,我遇到了以下错误:

[#|2012-05-11T14:12:03.460-0400|SEVERE|sun-appserver2.1|javax.enterprise.system.container.web|_ThreadID=89;_ThreadName=httpSSLWorkerThread-7311-0;_RequestID=7afaee11-c970-40dd-b5fb-29498af8e512;|StandardWrapperValve[LoginModule]: PWC1406: Servlet.service() for servlet LoginModule threw exception
java.lang.OutOfMemoryError: GC overhead limit exceeded

我认为由于GC的限制超出了,这与我的应用程序有关。有一个报告使用POI在excel中放置记录非常密集,因此我认为这可能是原因之一。作为一个短期解决方案,在下一个版本发布之前,我们通知了一个可以访问此报告的用户不要访问它。然而,两周后,今天再次有一个实例崩溃了,在搜索日志时,我发现了以下错误:

[#|2012-06-05T10:31:36.532-0400|SEVERE|sun-appserver2.1|net.jxta.impl.endpoint.mcast.McastTransport|_ThreadID=141;_ThreadName=IP Multicast Listener for mcast://228.8.10.93:31676;_RequestID=90caf76e-b740-4f11-8ffe-8ab88a740569;|Uncaught Throwable in thread :IP Multicast Listener for mcast://228.8.10.93:31676
java.lang.OutOfMemoryError: Java heap space
|#]

请注意GC overhead limit exceededJava heap space的区别。我正在试图找出今天我看到的错误是否由用户访问报告的相同原因引起,但我认为如果是这种情况,那么我会看到GC overhead limit exceeded
我认为今天的错误更与服务器配置相关。
请协助澄清。

两个错误的原因很可能是相同的。 - MRalwasser
你应该对你的应用程序进行分析,并检查它存在的内存泄漏问题。这是一个关于你的整个应用程序消耗大量内存的问题,而Apache POI Excel生成可能只是其中最大的内存问题之一。 - Luiggi Mendoza
我不明白的是在哪种情况下会引发哪种错误?难道不应该在我们遇到堆空间错误之前始终抛出GC Overhead limit exceeded吗?据我所知,如果GC在98%的时间内无法恢复超过2%,则大多数情况下堆已满。是这样吗? - endless
2个回答

2
第一个错误“GC Overhead”意味着垃圾回收占用了大量的CPU周期,通常是98%或99%,每次运行时释放的内存很少,只有1-2%。
第二个错误意味着您的应用程序在某些处理过程中耗尽了内存。
此外,您的调查结果是正确的,POI使用了过多的内存,POI在额外的内存消耗方面有一段历史。
在SO上发现了一个非常好的讨论:https://dev59.com/anM_5IYBdhLWcg3wZSTX

POI?我理解GC问题是因为CPU没有足够的时间释放内存,但第二个堆栈跟踪也是这样吗? - Anthony
第二个错误不是因为 CPU 周期,而是因为在应用程序运行时内存耗尽了,可能 GC 没有运行。可以通过添加一些额外的内存或更正代码来纠正第二个错误。 - mprabhat
如果您能解决Java堆问题,那么您的第一个问题也会得到解决。 - mprabhat
1
你的应用程序似乎存在内存泄漏问题。 - Amir Pashazadeh

0

这里有一个关于相似话题的好讨论在这里。它基本上是由于垃圾回收所消耗的时间很多,但回收的内存非常少。


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