[英]OutOfMemoryError heap dump
我有一個java.lang.OutOfMemoryError:GC Overhead limit exceeded
。 我的應用程序沒有HeapDumpOnOutOfMemoryError
命令行選項。 我需要堆轉儲,但是當我嘗試使用jmap
或jcmd
工具捕獲轉儲時,它們沒有響應:
地圖
D:\program>jmap -dump:live,format=b,file=d:\dump4.hprof 8280
Dumping heap to D:\dump4.hprof ...
jcmd
D:\program>jcmd 8280 GC.heap_dump d:\dump6.hprof
8280:
進程未完成,但已創建轉儲文件。 當我用 VisualVM 打開它們時,它們會無限加載。
如果我捕獲了例如 VisualVM 的堆轉儲,則工具將成功完成並創建並打開轉儲。
你能解釋一下為什么jmap
和jcmd
沒有完成嗎? 以及如何使用OutOfMemoryError
異常捕獲應用程序的轉儲? 應用程序仍在工作,但只有幾個活動線程。
一種可能性是您打算轉儲的堆大小太大。 請指定堆和 RAM 的大小。
這不是因為您的預期堆大小大於分配的堆大小。 當 JVM 花費太多時間執行垃圾收集並且只能回收很少的堆空間時,就會發生此錯誤。 您的應用程序可能最終使用了幾乎所有 RAM 並且垃圾收集器花費了太多時間嘗試清理它並反復失敗。
您的應用程序的性能會相對較慢,這是因為 CPU 將其全部容量用於垃圾收集,因此無法執行任何其他任務。
需要解決以下問題:
您還可以使用自動圖形工具,例如 JConsole,它有助於檢測代碼中的性能問題,包括 java.lang.OutOfMemoryErrors。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.