背景
性能診斷是軟體工程師在日常工作中需要經常面對和解決的問題,在使用者體驗至上的今天,解決好應用的性能問題能帶來非常大的收益。Java 作為最流行的程式設計語言之一,其應用性能診斷一直受到業界廣泛關注。可能造成 Java 應用出現性能問題的因素非常多,例如線程控制、磁盤讀寫、資料庫通路、網絡I/O、垃圾收集等。想要定位這些問題,一款優秀的性能診斷工具必不可少。
Java 性能診斷工具簡介
在 Java 的世界裡,有許多診斷工具可供選擇,既包括像 jmap、jstat 這樣的簡單指令行工具,又包括 JVisualvm、JProfiler 等圖形化綜合診斷工具,同時還有 SkyWalking、ARMS 這樣的針對分布式應用的性能監控系統。下面分别對其進行介紹。
簡單指令行工具
JDK 内置了許多指令行工具,它們可用來擷取目标 JVM 不同方面、不同層次的資訊。
jinfo - 用于實時檢視和調整目标 JVM 的各項參數。
jstack - 用于擷取目标 Java 程序内的線程堆棧資訊,可用來檢測死鎖、定位死循環等。
jmap - 用于擷取目标 Java 程序的記憶體相關資訊,包括 Java 堆各區域的使用情況、堆中對象的統計資訊、類加載資訊等。
jstat - 一款輕量級多功能監控工具,可用于擷取目标 Java 程序的類加載、JIT 編譯、垃圾收集、記憶體使用等資訊。
jcmd - 相比 jstat 功能更為全面的工具,可用于擷取目标 Java 程序的性能統計、JFR、記憶體使用、垃圾收集、線程堆棧、JVM 運作時間等資訊。
圖形化綜合診斷工具
使用上述指令行工具或組合能幫您擷取目标 Java 應用性能相關的基礎資訊,但它們存在下列局限:
無法擷取方法級别的分析資料,如方法間的調用關系、各方法的調用次數和調用時間等(這對定位應用性能瓶頸至關重要)。
要求使用者登入到目标 Java 應用所在的主控端上,使用起來不是很友善。
分析資料通過終端輸出,結果展示不夠直覺。
下面介紹幾款圖形化的綜合性能診斷工具。
JVisualvm
JVisualvm是 JDK 内置的可視化性能診斷工具,它通過 JMX、jstatd、Attach API 等方式擷取目标 JVM 的分析資料,包括 CPU 使用率、記憶體使用量、線程堆棧資訊等。此外,它還能直覺地展示 Java 堆中各對象的數量和大小、各 Java 方法的調用次數和執行時間等。
JProfiler
JProfiler是由 ej-technologies 公司開發的一款 Java 應用性能診斷工具。它聚焦于四個重要主題上。
方法調用 - 對方法調用的分析可以幫助您了解應用程式正在做什麼,并找到提高其性能的方法。
記憶體配置設定 - 通過分析堆上對象、引用鍊和垃圾收集能幫您修複記憶體洩漏問題,優化記憶體使用。