更新時間:2021-10-13 13:26:43 來源:動力節(jié)點 瀏覽860次
性能診斷是軟件工程師在日常工作中需要經(jīng)常面對和解決的問題,在用戶體驗至上的今天,解決好應(yīng)用的性能問題能帶來非常大的收益。Java 作為最流行的編程語言之一,其應(yīng)用性能診斷一直受到業(yè)界廣泛關(guān)注。可能造成 Java 應(yīng)用出現(xiàn)性能問題的因素非常多,例如線程控制、磁盤讀寫、數(shù)據(jù)庫訪問、網(wǎng)絡(luò)I/O、垃圾收集等。想要定位這些問題,一款優(yōu)秀的性能診斷工具必不可少。
在 Java 的世界里,有許多診斷工具可供選擇,既包括像 jmap、jstat 這樣的簡單命令行工具,又包括 JVisualvm、JProfiler 等圖形化綜合診斷工具,同時還有 SkyWalking、ARMS 這樣的針對分布式應(yīng)用的性能監(jiān)控系統(tǒng)。下面分別對其進行介紹。
JDK 內(nèi)置了許多命令行工具,它們可用來獲取目標 JVM 不同方面、不同層次的信息。
jinfo - 用于實時查看和調(diào)整目標 JVM 的各項參數(shù)。
jstack - 用于獲取目標 Java 進程內(nèi)的線程堆棧信息,可用來檢測死鎖、定位死循環(huán)等。
jmap - 用于獲取目標 Java 進程的內(nèi)存相關(guān)信息,包括 Java 堆各區(qū)域的使用情況、堆中對象的統(tǒng)計信息、類加載信息等。
jstat - 一款輕量級多功能監(jiān)控工具,可用于獲取目標 Java 進程的類加載、JIT 編譯、垃圾收集、內(nèi)存使用等信息。
jcmd - 相比 jstat 功能更為全面的工具,可用于獲取目標 Java 進程的性能統(tǒng)計、JFR、內(nèi)存使用、垃圾收集、線程堆棧、JVM 運行時間等信息。
使用上述命令行工具或組合能幫您獲取目標 Java 應(yīng)用性能相關(guān)的基礎(chǔ)信息,但它們存在下列局限:
無法獲取方法級別的分析數(shù)據(jù),如方法間的調(diào)用關(guān)系、各方法的調(diào)用次數(shù)和調(diào)用時間等(這對定位應(yīng)用性能瓶頸至關(guān)重要)。
要求用戶登錄到目標 Java 應(yīng)用所在的宿主機上,使用起來不是很方便。
分析數(shù)據(jù)通過終端輸出,結(jié)果展示不夠直觀。
下面介紹幾款圖形化的綜合性能診斷工具。
JVisualvm是 JDK 內(nèi)置的可視化性能診斷工具,它通過 JMX、jstatd、Attach API 等方式獲取目標 JVM 的分析數(shù)據(jù),包括 CPU 使用率、內(nèi)存使用量、線程堆棧信息等。此外,它還能直觀地展示 Java 堆中各對象的數(shù)量和大小、各 Java 方法的調(diào)用次數(shù)和執(zhí)行時間等。
JProfiler是由 ej-technologies 公司開發(fā)的一款 Java 應(yīng)用性能診斷工具。它聚焦于四個重要主題上。
方法調(diào)用 - 對方法調(diào)用的分析可以幫助您了解應(yīng)用程序正在做什么,并找到提高其性能的方法。
內(nèi)存分配 - 通過分析堆上對象、引用鏈和垃圾收集能幫您修復(fù)內(nèi)存泄漏問題,優(yōu)化內(nèi)存使用。
線程和鎖 - JProfiler 提供多種針對線程和鎖的分析視圖助您發(fā)現(xiàn)多線程問題。
高級子系統(tǒng) - 許多性能問題都發(fā)生在更高的語義級別上。例如,對于JDBC調(diào)用,您可能希望找出執(zhí)行最慢的 SQL 語句。JProfiler 支持對這些子系統(tǒng)進行集成分析。
如果只需要診斷單機 Java 應(yīng)用的性能瓶頸,上面介紹的診斷工具就已經(jīng)夠用了。但隨著現(xiàn)代系統(tǒng)架構(gòu)逐漸從單體轉(zhuǎn)變?yōu)榉植际健⑽⒎?wù),單純使用上述工具往往無法滿足需求,這時就需要借助Jaeger、ARMS、SkyWalking這些分布式追蹤系統(tǒng)提供的全鏈路追蹤功能。分布式追蹤系統(tǒng)種類繁多,但實現(xiàn)原理都大同小異,它們通過代碼埋點的方式記錄 tracing 信息,通過 SDK 或 agent 將記錄的數(shù)據(jù)傳輸至中央處理系統(tǒng),最后提供 query 接口對結(jié)果進行展示和分析,想了解更多分布式追蹤系統(tǒng)的原理可參考文章開放分布式追蹤(OpenTracing)入門與 Jaeger 實現(xiàn)。
以上就是關(guān)于“Java性能分析工具的介紹”,如果您想了解更多相關(guān)信息,不妨來關(guān)注一下動力節(jié)點的Java開發(fā)工具,相信會對大家有所關(guān)注。