当内存不足时,运行Tomcat 8的Java 8在堆转储后永远不会停止。相反,它只是挂起,因为它最大限度地记忆。由于GC缓慢接近最大内存,因此服务器变得非常慢且无响应。点击最大值后JConsole平行线中的内存图64位linux / java版“1.8.0_102”/ Tomcat 8. Jconsole
我设置了-XX:HeapDumpOnOutOfMemoryError和-XX:HeapDumpPath。任何人都知道如何强制堆转储而不是JVM进入无响应/非常慢的响应模式?
任何人都知道如何强制堆转储而不是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的内存使用量远远大于物理内存量。
jmap是为任何正在运行的jvm创建堆转储的实用程序。这将允许您在崩溃之前创建堆转储
https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr014.html
但是,知道何时应该创建它将是一个时间问题。您可以使用后续堆并使用工具来比较堆。我强烈推荐使用Eclipse Memory Access Tool及其主导树视图来识别潜在的内存问题(https://www.eclipse.org/mat/)