VisualVM

GraalVM 提供對 VisualVM 的支援,這是一個多合一的 Java (和多語言) 監控與疑難排解工具。VisualVM 啟用強大且易於使用的 Java 工具,其中包括對所支援的客體語言進行堆積分析。目前可使用的語言和功能如下:

  • Java:堆積摘要、物件檢視、執行緒檢視、OQL 主控台
  • JavaScript:堆積摘要、物件檢視、執行緒檢視
  • Python:堆積摘要、物件檢視
  • Ruby:堆積摘要、物件檢視、執行緒檢視
  • R:堆積摘要、物件檢視

啟動 VisualVM #

  1. visualvm.github.io 下載最新的 VisualVM,解壓縮,並將其移動到應用程式目錄。

  2. 按兩下應用程式圖示以啟動。

啟動後,工具會立即在「應用程式」區域中顯示所有在本機執行的 Java 處理程序,包括 VisualVM 處理程序本身。

擷取堆積傾印 #

若要擷取 (例如) Ruby 應用程式的堆積傾印以供稍後分析,請啟動您的應用程式並讓它執行幾秒鐘以進行暖機。然後在 VisualVM 中在其處理程序上按一下滑鼠右鍵,並叫用「堆積傾印」動作。會開啟新的 Ruby 處理程序堆積檢視器。

注意:使用 Native Image 時,必須明確啟用堆積傾印支援。當叫用 native-image 工具時,加入 --enable-monitoring=heapdump,jvmstat 選項以啟用堆積傾印功能,並允許 VisualVM 透過 jvmstat 偵測原生執行檔。如此一來,您的應用程式會處理訊號,並在收到 SIGUSR1 訊號時擷取堆積傾印。如需從原生映像處理程序擷取堆積傾印的詳細資訊,請參閱產生原生堆積傾印頁面。

分析物件 #

一開始會顯示 Java 堆積的「摘要」檢視。若要分析 Ruby 堆積,請在「堆積檢視器」工具列中按一下最左邊的 (摘要) 下拉式選單,選擇 Ruby 堆積範圍,並選取「物件」檢視。現在,堆積檢視器會顯示所有 Ruby 堆積物件,依其類型彙總。

展開「結果」檢視中的「程序」節點,以查看此類型物件的清單。每個物件都會顯示其基礎實作所提供的邏輯值。展開物件以存取其變數和參考 (若有)。

VisualVM: Heap Viewer Objects

現在,按一下工具列中的按鈕來啟用「預覽」、「變數」和「參考」詳細資訊,然後選取個別的 ProcType 物件。在可用的情況下,「預覽」檢視會顯示對應的原始碼片段,「變數」檢視會顯示物件的變數,「參考」檢視會顯示參照所選物件的物件。

最後,使用「堆積檢視器」工具列中的「預設集」下拉式清單,將檢視從「所有物件」切換至「支配者」或「GC 根」。若要顯示堆積支配者,必須先計算保留大小,對於 server.rb 範例來說,這可能需要幾分鐘。在工具列中選取「物件」彙總以檢視個別的支配者或 GC 根。

VisualVM: Heap Viewer Objects Dominators

分析執行緒 #

按一下「堆積檢視器」工具列中最左邊的下拉式清單,然後為 Ruby 堆積選取「執行緒」檢視。現在,堆積檢視器會顯示 Ruby 執行緒堆疊追蹤,包括本機物件。也可以按一下 HTML 工具列按鈕,以文字方式顯示堆疊追蹤。

VisualVM: Heap Viewer Thread

讀取 JFR 快照 #

GraalVM 19.2.x 和更新版本隨附的 VisualVM 工具能夠讀取 JFR 快照,也就是使用 JDK Flight Recorder (先前為 Java Flight Recorder) 擷取的快照。JFR 是一種用於收集執行中 Java 應用程式的診斷和分析資料的工具。它已整合到 Java 虛擬機器 (JVM) 中,幾乎不會造成效能負擔,因此即使在負載很重的生產環境中也可以使用。

若要安裝以外掛程式形式發行的 JFR 支援

  1. 執行 $JAVA_HOME/bin/jvisualvm 以啟動 VisualVM;
  2. 導覽至「工具」>「外掛程式」>「可用的外掛程式」以列出所有可用的外掛程式,然後安裝 VisualVM-JFRVisualVM-JFR-Generic 模組。

可以使用「檔案」>「載入」動作開啟 JFR 快照,或是按兩下「JFR 快照」節點並將快照永久新增至 JFR 存放庫。請遵循您的 Java 版本的文件以建立 JFR 快照。

JFR 檢視器會讀取從 Java 7 開始建立的所有 JFR 快照,並以工具使用者熟悉的典型 VisualVM 檢視來呈現資料。

VisualVM: Viewing JFR via VisualVM

目前可使用的這些檢視和功能標籤:

  • 「概觀」標籤 - 顯示有關已錄製處理程序的基本資訊,例如其主要類別、引數、JVM 版本和組態,以及系統屬性。此標籤也提供對已錄製執行緒傾印的存取權。
  • 「監視器」標籤 - 顯示處理程序的執行時間和基本遙測資料:CPU 使用率、堆積和 Metaspace 使用率、已載入類別的數量,以及作用中 & 已啟動執行緒的數量。
  • 「執行緒」標籤 - 根據快照中錄製的所有事件,盡可能精確地重建執行緒時間軸 (根據錄製組態)。
  • 「鎖定」標籤 - 允許使用者分析執行緒同步。
  • 「檔案 IO」標籤 - 提供有關檔案系統的讀取和寫入事件的資訊。
  • 「Socket IO」標籤 - 提供有關網路的讀取和寫入事件的資訊。
  • 「取樣器」標籤 - 顯示每個執行緒的 CPU 使用率和記憶體配置,以及堆積直方圖。還有一個實驗性功能「CPU 取樣器」,用於根據已錄製的事件建立 CPU 快照。它不提供精確的效能分析,但仍有助於了解錄製的應用程式中發生了什麼,以及 CPU 瓶頸可能在哪裡。
  • 「瀏覽器」標籤 - 提供快照中錄製的所有事件的通用瀏覽器。
  • 「環境」標籤 - 提供錄製機器設定和條件的概觀,例如 CPU 型號、記憶體大小、作業系統版本、CPU 使用率、記憶體使用率等等。
  • 「錄製」標籤 - 列出錄製設定和基本快照遙測資料,例如事件數、總錄製時間等等。

注意:目前 JDK Flight Recorder 的支援仍為實驗階段。某些進階功能 (例如分析 JVM 內部、顯示事件堆疊追蹤,或支援從作用中處理程序建立 JFR 快照) 在此預覽版本中不可用,並會在後續版本中逐步解決。

與我們聯繫