簡體   English   中英

OutOfMemoryError 堆轉儲

[英]OutOfMemoryError heap dump

我有一個java.lang.OutOfMemoryError:GC Overhead limit exceeded 我的應用程序沒有HeapDumpOnOutOfMemoryError命令行選項。 我需要堆轉儲,但是當我嘗試使用jmapjcmd工具捕獲轉儲時,它們沒有響應:

地圖

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 的堆轉儲,則工具將成功完成並創建並打開轉儲。

你能解釋一下為什么jmapjcmd沒有完成嗎? 以及如何使用OutOfMemoryError異常捕獲應用程序的轉儲? 應用程序仍在工作,但只有幾個活動線程。

一種可能性是您打算轉儲的堆大小太大。 請指定堆和 RAM 的大小。

這不是因為您的預期堆大小大於分配的堆大小。 當 JVM 花費太多時間執行垃圾收集並且只能回收很少的堆空間時,就會發生此錯誤。 您的應用程序可能最終使用了幾乎所有 RAM 並且垃圾收集器花費了太多時間嘗試清理它並反復失敗。

您的應用程序的性能會相對較慢,這是因為 CPU 將其全部容量用於垃圾收集,因此無法執行任何其他任務。

需要解決以下問題:

  • 應用程序中哪些對象占據了堆的大部分?
  • 這些對象被分配在源代碼的哪些部分?

您還可以使用自動圖形工具,例如 JConsole,它有助於檢測代碼中的性能問題,包括 java.lang.OutOfMemoryErrors。

暫無
暫無

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

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