JVM性能監控工具的使用

了解JVM性能監控工具并能熟練使用,是Java開發者進階的必備技能。下面本文將為你介紹一些主流的JVM性能監控工具及其使用方法,并通過一些場景案例來分析如何應用這些工具解決實際問題。

🛠? JVM性能監控與調優工具指南

? 工具概覽

以下是幾款主流JVM監控工具的對比,方便你根據需求選擇:

工具名稱類型核心功能適用場景優點缺點
JVisualVMGUI可視化內存監控、線程分析、CPU分析、GC監控、堆Dump本地開發、內存泄漏初步分析、GC行為觀察JDK自帶、免費、功能全面、支持插件擴展(如Visual GC)監控遠程需配置JMX參數、生產環境可能需更高權限
JProfilerGUI商業化CPU&內存采樣、線程&鎖分析、內存泄漏檢測高級探針(數據庫/Kafka等)生產環境深度性能分析、內存泄漏精準定位、鏈路追蹤功能強大集成度高、對應用影響相對較低商業付費、配置相對復雜
Java Mission Control (JMC)GUI/JDK自帶實時監控JFR飛行記錄、事件分析、MBean管理生產環境監控、事后日志分析、性能瓶頸定位JDK自帶JFR開銷低、適合長期監控深度分析能力略遜于JProfiler
命令行工具命令行jpsjstatjstackjmapjinfo服務器無GUI環境、快速排查、編寫監控腳本所有環境可用、輕量快速需要記憶命令、輸出不夠直觀
Arthas命令行診斷在線診斷、熱部署、方法執行監控、線程阻塞檢測生產環境在線診斷、動態跟蹤問題、無需重啟應用功能強大無需重啟、阿里巴巴開源需要一定學習成本

🔧 工具詳解與使用指南

1. JVisualVM

JVisualVM是JDK自帶的一款圖形化監控工具,無需單獨安裝。你可以在JDK安裝目錄的bin文件夾下找到它(例如,在Windows上,它是jvisualvm.exe,在Linux/Mac上是jvisualvm)。

基本使用:
  1. 啟動:命令行輸入 jvisualvm 即可啟動。
  2. 監控本地應用:啟動后,在左側"本地"節點下,你會看到當前機器上運行的所有Java進程,雙擊即可監控。
  3. 監控遠程應用:要監控遠程服務器上的Java應用,需要在遠程應用啟動時添加JMX參數:
    -Dcom.sun.management.jmxremote=true
    -Djava.rmi.server.hostname=<遠程服務器IP> # 例如 192.168.1.100
    -Dcom.sun.management.jmxremote.port=18999 # 自定義一個端口號
    -Dcom.sun.management.jmxremote.authenticate=false # 為簡單起見,先關閉認證
    -Dcom.sun.management.jmxremote.ssl=false
    
    然后在JVisualVM中,右鍵"遠程" -> “添加遠程主機” -> 輸入主機IP -> 右鍵該主機 -> “添加JMX連接” -> 輸入配置的端口號即可連接。
  4. 安裝插件(如Visual GC):JVisualVM支持插件擴展。推薦安裝Visual GC插件,它可以直觀地展示垃圾回收各內存區域(Eden、Survivor、Old Gen)的變化情況。安裝步驟:菜單欄"工具" -> “插件” -> 在"可用插件"標簽頁中找到"Visual GC"并安裝。
主要功能標簽:
  • 概述:查看JVM參數、系統屬性。
  • 監視:查看CPU堆內存使用情況、類加載數量、線程數量變化曲線。
  • 線程:實時查看線程狀態,檢測死鎖
  • 抽樣器:可以對CPU和內存進行抽樣分析,查看耗時方法或內存中對象數量。
  • Visual GC(需安裝插件):直觀可視化地監控堆內存各分區和GC活動。

2. JProfiler

JProfiler是一款功能強大的商業版Java性能分析工具,提供10天免費試用。

基本使用:
  1. 連接應用:啟動JProfiler后,可以選擇會話類型:
    • 本地會話:選擇本地Java進程。
    • 遠程會話:配置遠程服務器的主機名和端口(通常需要在遠程服務器上啟動一個小的代理程序)。
  2. 主要視圖
    • CPU視圖:分析方法的執行時間,找出CPU熱點。支持采樣和調用樹兩種模式。
    • 內存視圖:查看對象數量大小分配點,幫助發現內存泄漏。可以查看對象引用關系圖。
    • 線程視圖:查看線程狀態、調用棧,檢測死鎖
    • 探針:對數據庫、JMS、Servlet等提供專門的監控探針。

3. Java Mission Control (JMC)

JMC也是JDK自帶的一套工具,更適合生產環境監控。

基本使用:
  1. 啟動:命令行輸入 jmc 啟動。
  2. 飛行記錄器 (JFR):這是JMC的核心功能,它可以以極低的性能開銷(通常<2%)記錄JVM在運行時的詳細事件信息。
    • 開啟JFR:在JMC中連接到Java進程后,可以啟動一個飛行記錄。通常需要設置記錄持續時間(如1分鐘)和記錄哪些事件。
    • 也可以在啟動應用時直接開啟
      -XX:+StartFlightRecording=delay=20s,duration=60s,name=MyRecording,filename=myrecording.jfr,settings=profile
      
    • 分析記錄文件:記錄結束后會生成.jfr文件,可以用JMC打開進行分析,查看方法熱點、鎖競爭、GC活動等詳細信息。

4. 命令行工具集

這些工具在服務器無GUI環境時非常有用。

  • jps:列出當前用戶下的所有Java進程的PID和主類名。
    jps
    
  • jstat:查看JVM統計信息,最常用的是監控GC情況。
    jstat -gc <pid> 1000 # 每1000毫秒(1秒)輸出一次GC情況統計
    
  • jstack:生成當前JVM的所有線程快照,用于分析線程狀態、查找死鎖。
    jstack <pid> > thread_dump.txt # 將輸出重定向到文件
    
  • jmap:生成堆轉儲(Heap Dump)文件,用于離線分析內存使用。
    jmap -dump:format=b,file=heap.hprof <pid> # 生成堆轉儲文件
    

5. Arthas

Arthas是阿里巴巴開源的Java診斷工具,功能強大,無需重啟應用即可動態診斷。

基本使用:
  1. 下載并啟動Arthas:
    curl -O https://arthas.aliyun.com/arthas-boot.jar
    java -jar arthas-boot.jar
    
  2. 啟動后會列出當前所有Java進程,輸入序號連接對應進程。
  3. 常用命令:
    • dashboard:實時儀表板,查看整體情況。
    • thread:查看線程信息。thread -b 自動檢測死鎖。
    • trace:追蹤方法內部調用路徑,并輸出每個節點的耗時。
      trace com.example.service.UserService getUserInfo '#cost > 100' # 只追蹤耗時大于100ms的調用
      
    • watch:監測方法執行時的入參、返回值、異常等信息。
    • jad:反編譯指定類的字節碼。

📊 場景分析案例

案例1:內存泄漏分析 (Memory Leak)

  • 場景:應用運行一段時間后響應越來越慢,甚至出現OutOfMemoryError: Java heap space錯誤。
  • 工具選擇:JVisualVM 或 JProfiler 的堆Dump分析功能,或者結合 jmap 和 MAT。
  • 分析步驟
    1. jstat -gc <pid> 1s觀察GC頻率和各代內存使用趨勢,如果老年代使用率持續上升且Full GC后回收效果很差,很可能有內存泄漏。
    2. 使用 JVisualVM 執行“堆Dump”。
    3. 在堆Dump分析界面,通常可以先看“類”視圖,按“大小”或“實例數”排序,尋找疑似泄漏的類(比如某個類的實例數異常多)。
    4. 右鍵該類,選擇“在實例視圖中顯示”,查看所有實例。
    5. 檢查某個實例的“引用鏈”,看是哪個GC Root持有者這些對象的引用導致無法回收(常見原因如靜態集合、緩存等未及時清理)。
    6. JProfiler 的內存視圖和Arthaswatch命令也可以動態觀察可疑對象的創建和增長情況。

案例2:CPU使用率飆高 (High CPU Usage)

  • 場景:應用CPU使用率持續超過80%甚至更高,系統響應緩慢。
  • 工具選擇:Arthas, JProfiler CPU視圖,或結合命令行工具。
  • 分析步驟
    1. 命令行快速定位
      • topps 找到CPU高的Java進程PID。
      • top -Hp <pid> 找出該進程中消耗CPU最高的線程ID(TID)。
      • 將TID轉換為16進制(printf "%x\n" <TID>)。
      • jstack <pid> | grep -A 30 <nid> (nid即十六進制TID)查看該線程的堆棧信息,定位正在執行的方法。
    2. 使用Arthas
      • 連接應用后,使用 thread 命令查看所有線程的CPU使用情況。
      • 使用 trace 命令追蹤疑似高耗時的方法,定位性能瓶頸。
    3. 使用JProfiler
      • CPU視圖的調用樹熱點視圖可以清晰地顯示出哪些方法消耗了最多的CPU時間。

案例3:頻繁Full GC

  • 場景:應用停頓(STW)頻繁,監控發現Full GC次數過多。
  • 工具選擇jstat, JVisualVM (Visual GC插件), JMC (JFR GC日志分析)。
  • 分析步驟
    1. 首先在應用啟動時添加GC日志參數,這是分析GC問題最詳細的資料:
      -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/path/to/gc.log
      
    2. 使用 jstat -gcutil <pid> 1s 實時觀察各代內存使用比例和GC次數/時間。
    3. 使用 JVisualVMVisual GC 插件直觀觀察各內存區域的變化和GC活動。
    4. 分析GC日志(可使用在線分析工具如GCEasy或GCViewer),關注:
      • Full GC觸發原因(如 Allocation Failure, Metadata GC Threshold等)。
      • Full GC前后老年代的使用量變化。
      • Full GC的持續時間。
    5. 根據分析結果調整JVM參數,如堆大小(-Xms, -Xmx)、新生代與老年代比例(-XX:NewRatio)、幸存區比例(-XX:SurvivorRatio),或更換更高效的垃圾收集器(如G1、ZGC)。

案例4:線程死鎖 (Thread Deadlock)

  • 場景:應用部分功能完全卡死,無響應,但進程還在。
  • 工具選擇:JVisualVM 線程標簽頁,jstack, Arthas thread -b
  • 分析步驟
    1. 使用 JVisualVM 連接到進程,切換到“線程”標簽頁,如果有死鎖,工具通常會直接提示“檢測到死鎖”,并列出死鎖的線程和涉及的鎖。
    2. 使用 jstack <pid>,輸出中通常會包含明確的死鎖信息段。
    3. 使用 Arthasthread -b 命令可以快速檢測并列出當前阻塞其他線程的線程

💎 總結與建議

選擇哪款工具很大程度上取決于你的具體場景和需求。你可以參考以下建議:

  • 初學者/本地開發:從 JVisualVM 開始,它是JDK自帶的,功能全面,足夠應對大多數常見問題。
  • 生產環境深度分析:如果條件允許,JProfilerJMC/JFR 是更專業的選擇。JFR的開銷尤其適合長期監控。
  • 服務器緊急排查命令行工具(jps, jstat, jstack, jmap)和 Arthas 是你的首選,它們無需GUI,靈活高效。
  • 監控遠程應用:記得在啟動應用時配置好JMX參數
  • 內存分析:生成堆轉儲(Heap Dump)并用JVisualVMJProfiler或專門的Eclipse MAT分析是標準流程。
  • CPU/線程問題Arthastracethread命令,或JProfiler的CPU視圖和線程視圖非常強大。

希望這份詳細的指南和案例能幫助你更好地理解和使用JVM性能監控工具!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/97614.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/97614.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/97614.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【工作】一些找工作需要了解避雷的知識

面試前 1.公司的具體情況 公司全稱&#xff0c;辦公地點&#xff0c;涉及崗位 要求hr做個簡單的公司介紹 2.崗位職責/業務方向 工作內容、公司業務 3.薪資待遇&#xff0c;構成&#xff0c;底薪&#xff0c;五險一金 問一下工資范圍 底薪 &#xff08;有責&#xff0c;無…

五、練習2:Git分支操作

練習2&#xff1a;Git分支操作 練習目標 掌握Git分支的創建、切換、合并等操作&#xff0c;理解分支在開發中的作用。 練習步驟 步驟1&#xff1a;準備基礎倉庫 # 創建練習目錄 mkdir branch-practice cd branch-practice# 初始化倉庫 git init# 創建初始文件 echo "# 分支…

【筆記】算法設計:異或空間線性基

Content1.什么是異或&#xff08;定義和性質&#xff09;2.異或空間線性基的構造方法3.異或空間線性基的應用4.算法設計例舉5.小結說明算法設計應用之前&#xff0c;首先明確異或空間線性基&#xff1a;一種數據結構。用于處理異或關系&#xff08;運算&#xff09;下的向量空間…

Filebeat采集數據與日志分析實戰

&#x1f31f;Filebeat采集數據的原理 Filebeat默認按行采集數據&#xff0c;如果數據沒有換行&#xff0c;則該條數據無法采集到 屬于有狀態服務&#xff0c;可以記錄上一次采集數據的位置點信息 修改配置文件 vim /etc/filebeat/config/03-log-to-console.yaml filebeat.inp…

Fluent Bit針對kafka心跳重連機制詳解(下)

#作者&#xff1a;程宏斌 文章目錄disconnectreconnect接上篇&#xff1a;https://blog.csdn.net/qq_40477248/article/details/150957571?spm1001.2014.3001.5501disconnect 斷開連接的情況主要是兩種: 連接或傳輸過程中有錯誤發生 超時, 比如空閑時間超時 ** * Close and …

React 第七十一節 Router中generatePath的使用詳解及注意事項

前言 generatePath 是 React Router 的一個實用工具函數&#xff0c;用于根據路徑模式和參數對象生成實際的 URL 路徑。它在需要動態構建鏈接的場景中非常有用&#xff0c;比如生成導航鏈接或重定向路徑。 1、基本用法和注意事項 import { generatePath } from react-router-do…

Python 爬蟲案例:爬取豆瓣電影 Top250 數據

一、案例背景與目標 豆瓣電影 Top250 是國內權威的電影評分榜單之一&#xff0c;包含電影名稱、評分、評價人數、導演、主演、上映年份、國家 / 地區、類型等關鍵信息。本案例將使用 Python 編寫爬蟲&#xff0c;實現以下目標&#xff1a; 自動請求豆瓣電影 Top250 的 10 個分…

SPA安全警示:OAuth2.0致命漏洞

OAuth2.0在SPA應用中的安全陷阱SPA&#xff08;單頁應用&#xff09;通常采用隱式授權&#xff08;Implicit Flow&#xff09;或PKCE&#xff08;Proof Key for Code Exchange&#xff09;授權模式&#xff0c;但存在以下安全隱患&#xff1a;隱式授權模式的漏洞訪問令牌直接暴…

table表格字段明細展示

文章目錄1、字段渲染2、異步請求展示明細3、hover展示問題3.1 基本邏輯3.2 hover時長判斷3.3 renderhover表格字段明細展示&#xff0c;屬于比較小的需求&#xff0c;但是也有一定交互細節&#xff0c;本文選取部分場景。 1、字段渲染 render和渲染組件是有區別的。render常見為…

主網上線后生態極速擴張的 Berachain 生態,有哪些值得關注的項目?

Berachain 是典型的將 DeFi 思維嵌入到共識機制中的 Layer1&#xff0c;其核心是 PoL&#xff08;Proof of Liquidity&#xff09;共識。PoL 要求驗證者在獲得區塊獎勵前&#xff0c;必須將流動性導入白名單協議&#xff0c;并由市場決定資金流向。這樣&#xff0c;驗證者的權重…

claude-code對比GitHub-Copilot

Claude Code 文檔日期&#xff1a;2025 年 08 月 20 日 定位 項目級開發助手&#xff0c;專注于全局視野和復雜任務的處理。 特點 超長上下文支持&#xff1a;支持 200k 超長上下文&#xff0c;適合處理復雜項目。豐富的自定義命令&#xff1a;提供靈活的命令配置&#xff0c;滿…

Roo Code自定義Mode(模式)

什么是自定義模式&#xff1f; 簡單來說&#xff0c;自定義模式就像是給Roo Code穿上不同的"職業裝"。你可以創建針對特定任務或工作流程量身定制的模式&#xff0c;讓Roo在不同場景下表現出專業的行為。 這些模式分為兩種類型&#xff1a;全局模式&#xff08;在所有…

Next.js渲染模式:SSR、SSG與ISR揭秘

Next.js 核心渲染模式深度解析&#xff1a;SSR、SSG 與 ISR 在構建現代 Web 應用時&#xff0c;性能和用戶體驗是至關重要的考量。Next.js 作為 React 生態中一個備受推崇的框架&#xff0c;其強大的服務端渲染&#xff08;SSR&#xff09;、靜態站點生成&#xff08;SSG&#…

Veo Videos Generation API 對接說明

本文介紹了如何對接 Veo Videos Generation API&#xff0c;通過輸入自定義參數生成Veo官方視頻。 下面將詳細闡述 Veo Videos Generation API 的對接流程。 申請流程 使用 API 前&#xff0c;需前往 Veo Videos Generation API 頁面申請服務。進入頁面后&#xff0c;點擊「…

YOLO 目標檢測:YOLOv3網絡結構、特征輸出、FPN、多尺度預測

文章目錄一、YOLOV31、網絡結構1.1 整體結構1.2 主干網絡1.3 特征輸出1.4 特征融合FPN&#xff08;Feature Pyramid Networks&#xff09;FPN 融合上采樣融合2、多尺度預測3、損失函數4、性能對比一、YOLOV3 YOLOv3&#xff08;You Only Look Once v3&#xff09;是YOLO系列中…

【GIS圖像處理】有哪些SOTA方法可以用于將1.5米分辨率遙感圖像超分辨率至0.8米精度的?

針對將1.5米分辨率遙感圖像超分辨率至0.8米的需求,當前主流方法可分為以下幾類,結合最新研究進展和實際應用場景,具體技術方案及SOTA方法如下: 一、基于Transformer的高效建模 1. Top-k標記選擇Transformer(TTST) 核心機制:通過動態選擇前k個關鍵標記(token),消除冗…

【電力電子】逆變器控制策略:PQ Droop下垂控制、電壓電流雙環控制與SPWM調制

逆變器中的 PQ Droop 控制。 1. PQ Droop 控制的定義 PQ Droop(有時也稱為功率下垂控制,Power Droop Control)是微電網、并聯系統或逆變器并網運行中常用的一種分布式功率控制方法。 P-Droop(有功下垂):通過調節逆變器輸出頻率與有功功率之間的關系實現功率分配。 Q-Dro…

【LeetCode 熱題 100】5. 最長回文子串——中心擴散法

Problem: 5. 最長回文子串 文章目錄整體思路完整代碼時空復雜度時間復雜度&#xff1a;O(N^2)空間復雜度&#xff1a;O(1)整體思路 這段代碼旨在解決經典的 “最長回文子串” (Longest Palindromic Substring) 問題。問題要求在一個給定的字符串 S 中&#xff0c;找到一個最長…

六、練習3:Gitee平臺操作

練習3&#xff1a;Gitee平臺操作 練習目標 掌握Gitee平臺的基本操作&#xff0c;包括創建倉庫、推送代碼、團隊協作等。 練習步驟 步驟1&#xff1a;Gitee賬號準備 訪問 gitee.com注冊賬號&#xff08;如果還沒有&#xff09;登錄Gitee 步驟2&#xff1a;配置SSH密鑰 # …

Git軟件版本控制

軟件版本控制作用&#xff1a;軟件源碼版本管理、多人協作開發、版本多分支開發、代碼回滾&#xff08;回退&#xff09;等功能。集中式版本控制&#xff1a;將代碼倉庫放在一臺服務器上&#xff0c;開發時要依賴這臺服務器。優點&#xff1a;簡單、方便管理、適合中小型項目缺…