簡體   English   中英

Java 8 JVM掛起,但內存不足時不會崩潰/堆轉儲

[英]Java 8 JVM hangs, but does not crash/ heap dump when out of memory

當內存不足時,運行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/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM