天天看點

Java性能分析工具的介紹

背景

性能診斷是軟體工程師在日常工作中需要經常面對和解決的問題,在使用者體驗至上的今天,解決好應用的性能問題能帶來非常大的收益。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 應用性能診斷工具。它聚焦于四個重要主題上。

方法調用 - 對方法調用的分析可以幫助您了解應用程式正在做什麼,并找到提高其性能的方法。

記憶體配置設定 - 通過分析堆上對象、引用鍊和垃圾收集能幫您修複記憶體洩漏問題,優化記憶體使用。

分布式應用性能診斷