捕獲 Java 堆轉儲的不同方法
堆轉儲是在特定時間點對 Java 程序的記憶體(更具體地說是 Java 堆記憶體)進行快照。它包含有關 Java 物件和類的資訊。當我們需要除錯記憶體問題(例如記憶體洩漏、高記憶體消耗和記憶體不足錯誤)時,堆轉儲非常有用。Java 提供了幾種捕獲這些堆轉儲的方法,我們將在本文中探討這些方法。
捕獲 Java 堆轉儲的方法
可以使用以下方法捕獲 Java 堆轉儲
HeapDumpOnOutOfMemoryError
Jcmd
jmap
讓我們依次討論這些方法。
使用 HeapDumpOnOutOfMemoryError
有一些方法可以手動捕獲堆轉儲,我們將在後面討論。本節將概述 HeapDumpOnOutOfMemoryError,它允許我們自動捕獲堆轉儲。
在 Java 中,“OutOfMemoryError” 發生在堆記憶體空間不足時。這是捕獲堆轉儲最理想的時間,因為在發生錯誤時很容易調查和除錯記憶體錯誤。
我們可以配置 HeapDumpOnOutOfMemoryError,它會在 Java 應用程式丟擲 java.lang.OutOfMemoryError 時生成堆轉儲。
在這種情況下,我們需要傳遞以下系統屬性
java -XX:+HeapDumpOnOutOfMemoryError
堆轉儲儲存的預設目錄是 java_pid
使用 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 命令列工具用於手動捕獲。