我们的Java应用程序在RHEL 8.5 OS平台上运行良好。在我们的应用程序中,我们提供了足够的堆空间,即“2048m”。尽管如此,我们在2023年1月遇到了一个heap.dump文件。我们分析了heap.dump文件,发现它是一个NACACK错误。
在不删除heap.dump文件的情况下,我们只需要重新启动服务器,应用程序就可以正常工作了。
java.lang.OutOfMemoryError: GC overhead limit exceeded
Dumping heap to /XYZ/jboss/server/log/heap.dump ...
Unable to create /XYZ/jboss/server/log/heap.dump: File exists.
请查找以下查询,
1.在存在heap.dump文件的情况下重新启动服务器是否会完全清除堆内存区域?
1.新的错误是否是由于前一个heap.dump文件未清除造成的?
1.有哪些可能性会这么快得到上述错误?
谢谢。
1条答案
按热度按时间fdx2calv1#
1.在存在heap.dump文件的情况下重新启动服务器是否会完全清除堆内存区域?
当JVM启动/重新启动时,堆将始终为空。
JVM启动时不会读取堆转储文件。它的存在与否无关紧要。
1.新的错误是否是由于前一个heap.dump文件未清除造成的?
不。见上文。
消息说JVM再次OOME,但是JVM不愿意(或者不能)覆盖现有的转储文件,所以你没有得到一个新的堆转储。
1.有哪些可能性会这么快得到上述错误?
一般来说,bug(可能在您的应用程序中)或堆太小。或两者兼而有之。原因包括以下几点:
这个问题的“根本原因”很可能是以前的问题之一。
Reference
对象等,GC的引用处理线程可能无法跟上,导致OOME。如果不详细检查应用程序并查看堆转储和OOME中的堆栈跟踪,就不可能更具体。
这个Q&A可能有帮助,但我不认为它回答了你的问题: