捕獲 Java 堆轉儲的不同方法


堆轉儲是在特定時間點對 Java 程序的記憶體(更具體地說是 Java 堆記憶體)進行快照。它包含有關 Java 物件和類的資訊。當我們需要除錯記憶體問題(例如記憶體洩漏、高記憶體消耗和記憶體不足錯誤)時,堆轉儲非常有用。Java 提供了幾種捕獲這些堆轉儲的方法,我們將在本文中探討這些方法。

捕獲 Java 堆轉儲的方法

可以使用以下方法捕獲 Java 堆轉儲

  • HeapDumpOnOutOfMemoryError

  • Jcmd

  • jmap

讓我們依次討論這些方法。

使用 HeapDumpOnOutOfMemoryError

有一些方法可以手動捕獲堆轉儲,我們將在後面討論。本節將概述 HeapDumpOnOutOfMemoryError,它允許我們自動捕獲堆轉儲。

在 Java 中,“OutOfMemoryError” 發生在堆記憶體空間不足時。這是捕獲堆轉儲最理想的時間,因為在發生錯誤時很容易調查和除錯記憶體錯誤。

我們可以配置 HeapDumpOnOutOfMemoryError,它會在 Java 應用程式丟擲 java.lang.OutOfMemoryError 時生成堆轉儲。

在這種情況下,我們需要傳遞以下系統屬性

java -XX:+HeapDumpOnOutOfMemoryError

堆轉儲儲存的預設目錄是 java_pid.hprof 檔案。我們可以在執行應用程式的位置獲取此檔案。

使用 jcmd

“jcmd” 是 JDK 中的命令列工具。它可用於向正在執行的 Java 程序傳送診斷命令。其中一個命令是 GC.heap_dump,用於從指定的 Java 程序生成堆轉儲。

要使用 jcmd,我們需要知道程序 ID,為了方便起見,我們可以將其稱為 Java 應用程式的 PID。可以使用命令“jps”查詢 PID。

使用以下命令生成堆轉儲

jcmd <pid> GC.heap_dump <filename>

使用 jmap

它是 JDK 中的另一個命令列工具。它可用於列印堆資訊並從正在執行的 Java 程序或核心檔案中生成堆轉儲。與 jcmd 類似,我們需要知道 Java 應用程式的程序 ID(簡稱 PID)才能使用 jmap。可以使用命令“jps”查詢 PID。

要生成堆轉儲,請使用以下命令

jmap -dump:[live], format = b, file = <pathOffile> <pid>

這裡,

live:這是一個可選但重要的引數,因為它只轉儲堆中的活動物件。換句話說,如果我們傳遞此選項,它只寫入具有活動引用的物件。

format:它指示堆轉儲檔案的格式。如果設定為“b”,則表示它將具有二進位制格式。

pathOffile:用於指定堆轉儲將寫入到的檔案路徑。

pid:指定程序 ID。

這將建立一個具有指定名稱的二進位制堆轉儲檔案。提醒一下,請注意,有時此工具無法獲得我們想要的結果,因為它已被 Java 棄用。最好使用本文中討論的其他工具。

結論

我們從定義 Java 堆轉儲開始本文,在下一節中,我們提出了幾種捕獲堆轉儲的方法。我們討論了三種方法,HeapDumpOnOutOfMemoryError 是一種自動捕獲堆轉儲的方法,而 jmap 和 jcmd 命令列工具用於手動捕獲。

更新於:2023-07-19

147 次檢視

開啟您的 職業生涯

透過完成課程獲得認證

開始學習
廣告