在 Java 中,堆轉儲提供了某個時刻 Java 虛擬機器記憶體中存在的整個物件的快照。堆轉儲對於解決記憶體洩漏問題和優化不同 java 應用程式中的記憶體使用非常有用。每個實例的詳細資訊(如位址、類別名稱、類型、對另一個物件的參考)都記錄在堆轉儲中。堆轉儲有兩種格式,例如手提式堆轉儲格式、二進位格式和asci 文字的經典格式。在下面的部分中,讓我們了解生成堆轉儲的不同工具和技術。
開始您的免費軟體開發課程
網頁開發、程式語言、軟體測試及其他
通常,此堆轉儲用於我們正在使用的 Java 應用程式佔用的記憶體超過我們的預期,或者應用程式因 OutOfMemoryError 崩潰。如果我們分析堆轉儲,將有助於識別異常的根本原因。除此之外,堆轉儲還可以用於識別詳細信息,例如每個類別的記憶體使用情況、每個類別中的物件數量等。此外,還可以捕捉精細的細節,以及單一物件佔用的記憶體量還可以找出應用程式中存在的Java物件。這些資訊可以幫助我們識別導致記憶體洩漏問題的實際代碼。
以下是以下提到的以下工具和技術
堆轉儲可以使用 JDK 下的不同工具來捕獲,這些工具位於 JDK 主目錄中的 bin 資料夾中。為此,可以使用命令列,因為該目錄存在於系統路徑中。
jmap 是一個可在本地和遠端進程中使用的工具,用於列印正在運行的 JVM 中的記憶體統計資訊。
要使用 jmap 產生堆轉儲,可以使用 dump 選項,如下所示。
jmap -dump:[live] , format = b , file=< path of the file > <process id>
jcmd 是一個向 Java 虛擬機器發送命令請求的工具。此外,它必須存在於執行 Java 進程的機器中。
要取得堆轉儲,可以使用指令 GC.heap_dump,只需提及輸出的 pid 和檔案路徑,如下所示。
jcmd < pid > GC.heap_dump < path of the file >
JVisualVM 是一個具有簡單直覺的圖形使用者介面的工具,可讓我們監視、故障排除和分析 Java 應用程式。要使用它產生堆轉儲,必須右鍵單擊 Java 進程,並選擇“堆轉儲”選項。完成此操作後,該工具將建立堆轉儲,並在新分頁中開啟它。
不使用上述的手動技術,而是使用命令列選項 HeapDumpOnOutOfMemoryError 在拋出 java.lang.OutOfMemoryError 時自動建立堆轉儲:
java - XX:+HeapDumpOnOutOfMemoryError
java_pid
除了預設路徑之外,還可以使用其他檔案路徑,為此,可以使用 HeapDumpPath 選項,如下所示。
java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=< file_path >
因此,當應用程式使用這種方式運行記憶體中斷時,可以在建立的由堆轉儲組成的檔案中看到日誌:
在此,HotSpotDiagnostic MBean 用於產生允許 2 個參數的 dumpHeap 技術。
他們是:
outputFile,這是建立的轉儲的檔案路徑。確保該檔案的副檔名應為 hprof。
live,和jmap中的類似。如果設定了此項,則僅列印具有活動參考的物件
讓我們看看兩種不同的技術來呼叫此方法來捕捉堆轉儲。
像 JConsole 這樣的 JMX 客戶端是使用 HotSpotDiagnostic MBean 的最簡單方法。如果 JConsole 開啟並連接到正在執行的 Java 進程,導覽至 MBeans 標籤並識別 com.sun.management 下存在的 HotSpotDiagnostic。在操作中,可以找到先前解釋過的dumpHeap方法。為了執行 dumpHeap 操作,參數 outputFile 和 live 作為 p0 和 p1 文字欄位。
與 JConsole 類似,HotSpotDiagnostic MBean 可以透過 Java 程式碼的程式呼叫來使用。為此,MBeanServer 實例必須在應用程式中註冊 MBean。完成後,需要一個 HotSpotDiagnosticMXBean 實例,並且必須呼叫該實例的 dumpHeap 方法。
假設您正在使用的應用程式運行在 IBM Websphere Application Server 上;管理控制台可以產生堆疊。首先,在管理控制台的導覽窗格中,選擇“故障排除”,然後選擇“Java 轉儲和核心”。完成此操作後,為必須建立堆轉儲的伺服器選擇 server_name。之後,按一下「堆轉儲」為上述伺服器建立堆轉儲。 wsadmin 也可以用於建立堆轉儲。
以上是Java 堆轉儲的詳細內容。更多資訊請關注PHP中文網其他相關文章!