当内存不足时,运行Tomcat 8的Java 8不会在堆转储后停止。相反,它只是因为最大内存而挂起。由于大量GC导致服务器缓慢接近最大内存,因此服务器变得非常缓慢且无响应。达到最大值后,JConsole扁平线中的内存图。 64位linux / java版本“ 1.8.0_102” / Tomcat 8。Jconsole
我已设置-XX:HeapDumpOnOutOfMemoryError和-XX:HeapDumpPath。有谁知道如何强制堆转储而不是让JVM进入无响应/响应速度很慢的模式?
答案 0 :(得分:1)
有人知道如何强制堆转储而不是让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的内存使用量明显大于物理内存量。
答案 1 :(得分:-1)
jmap是可为任何正在运行的jvm创建堆转储的实用程序。这将允许您在崩溃之前创建堆转储
https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr014.html
但是,知道何时创建它只是时间问题。您可以获取后续堆,并使用工具比较堆。我强烈建议使用Eclipse内存访问工具,它是主控树视图,用于识别潜在的内存问题(https://www.eclipse.org/mat/)