首页 > 解决方案 > Java 8 JVM 挂起,但在内存不足时不会崩溃/堆转储

问题描述

当内存不足时,运行 Tomcat 8 的 Java 8 在堆转储后永远不会停止。相反,它只是挂起,因为它最大内存。由于广泛的 GC,服务器变得非常缓慢且无响应,因为它慢慢接近最大内存。达到最大值后,JConsole 中的内存图呈扁平线。64 位 linux/java 版本“1.8.0_102”/Tomcat 8.Jconsole

我设置了 -XX:HeapDumpOnOutOfMemoryError 和 -XX:HeapDumpPath。任何人都知道如何强制堆转储而不是 JVM 进入无响应/非常慢的响应模式?

标签: javajvmheap-dump

解决方案


任何人都知道如何强制堆转储而不是 JVM 进入无响应/非常慢的响应模式?

你需要使用-XX:+UseGCOverheadLimit. 这告诉 GC 在垃圾收集所花费的时间百分比太高时抛出 OOME(或转储堆,如果您已配置)。这应该默认为最近的 JVM 启用……但您可能已禁用它。

您可以调整收集器放弃使用-XX:GCTimeLimit=...和的“开销”阈值-XX:GCHeapFreeLimit=...;请参阅https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gc-ergonomics.html

“开销”限制的影响是您的应用程序更早地获得了 GC 失败。希望这可以避免“死亡螺旋”效应,因为 GC 使用越来越多的时间来收集越来越少的实际垃圾。

另一种可能性是您的 JVM 需要很长时间来转储堆。如果真正的问题是您的 JVM 导致虚拟内存抖动,则可能会发生这种情况,因为 Java 的内存使用量明显大于物理内存量。


推荐阅读