背景
性能診斷是軟件工程師在日常工作中需要經(jīng)常面對和解決的問題,在用戶體驗至上的今天,解決好應用的性能問題能帶來非常大的收益。Java 作為最流行的編程語言之一,其應用性能診斷一直受到業(yè)界廣泛關(guān)注??赡茉斐?Java 應用出現(xiàn)性能問題的因素非常多,例如線程控制、磁盤讀寫、數(shù)據(jù)庫訪問、網(wǎng)絡I/O、垃圾收集等。想要了定位這些問題,一款優(yōu)秀的性能診斷工具必不可少。本文將介紹 Java 性能診斷過程中的常用工具,并重點介紹其中的優(yōu)秀代表 JProfiler 的基本原理和最佳實踐(本文所做的調(diào)研基于jprofiler10.1.4)。
一、Java 性能診斷工具簡介
在 Java 的世界里,有許多診斷工具可供選擇,既包括像 jmap、jstat 這樣的簡單命令行工具,又包括 JVisualvm、JProfiler 等圖形化綜合診斷工具,同時還有 SkyWalking、ARMS 這樣的針對分布式應用的性能監(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 應用性能相關(guān)的基礎(chǔ)信息,但它們存在下列局限:
- 無法獲取方法級別的分析數(shù)據(jù),如方法間的調(diào)用關(guān)系、各方法的調(diào)用次數(shù)和調(diào)用時間等(這對定位應用性能瓶頸至關(guān)重要)。
- 要求用戶登錄到目標 Java 應用所在的宿主機上,使用起來不是很方便。
- 分析數(shù)據(jù)通過終端輸出,結(jié)果展示不夠直觀。
下面介紹幾款圖形化的綜合性能診斷工具。
JVisualvm
JVisualvm 是 JDK 內(nèi)置的可視化性能診斷工具,它通過 JMX、jstatd、Attach API 等方式獲取目標 JVM 的分析數(shù)據(jù),包括 CPU 使用率、內(nèi)存使用量、線程堆棧信息等。此外,它還能直觀地展示 Java 堆中各對象的數(shù)量和大小、各 Java 方法的調(diào)用次數(shù)和執(zhí)行時間等。
更多可參考我之前寫的文章:【JVM 監(jiān)控工具】JVisualVM的使用
JProfiler
JProfiler 是由 ej-technologies 公司開發(fā)的一款 Java 應用性能診斷工具。它聚焦于四個重要主題上。
- 方法調(diào)用 - 對方法調(diào)用的分析可以幫助您了解應用程序正在做什么,并找到提高其性能的方法。
- 內(nèi)存分配 - 通過分析堆上對象、引用鏈和垃圾收集能幫您修復內(nèi)存泄漏問題,優(yōu)化內(nèi)存使用。
- 線程和鎖 - JProfiler 提供多種針對線程和鎖的分析視圖助您發(fā)現(xiàn)多線程問題。
- 高級子系統(tǒng) - 許多性能問題都發(fā)生在更高的語義級別上。例如,對于JDBC調(diào)用,您可能希望找出執(zhí)行最慢的 SQL 語句。JProfiler 支持對這些子系統(tǒng)進行集成分析。
JConsole
使用JConsole監(jiān)控進程、線程、內(nèi)存、cpu、類情況
四、分布式應用性能診斷
如果只需要診斷單機 Java 應用的性能瓶頸,上面介紹的診斷工具就已經(jīng)夠用了。但隨著現(xiàn)代系統(tǒng)架構(gòu)逐漸從單體轉(zhuǎn)變?yōu)榉植际健⑽⒎?,單純使用上述工具往往無法滿足需求,這時就需要借助 Jaeger、ARMS、SkyWalking 這些分布式追蹤系統(tǒng)提供的全鏈路追蹤功能。分布式追蹤系統(tǒng)種類繁多,但實現(xiàn)原理都大同小異,它們通過代碼埋點的方式記錄 tracing 信息,通過 SDK 或 agent 將記錄的數(shù)據(jù)傳輸至中央處理系統(tǒng),最后提供 query 接口對結(jié)果進行展示和分析。
五、IDEA中設(shè)置JProfiler
JProfiler是什么
? JProfiler直覺式的GUI讓你可以找到性能瓶頸、抓出內(nèi)存漏失(memory leaks)、并解決執(zhí)行緒的問題。它讓你得以對heap walker作資源回收器的root analysis,可以輕易找出內(nèi)存漏失;heap快照(snapshot)模式讓未被參照(reference)的對象、稍微被參照的對象、或在終結(jié)(finalization)隊列的對象都會被移除;整合精靈以便剖析瀏覽器的Java外掛功能。
功能
-
本地會話實時分析模式
用戶一旦定義好了其應用程序啟動方式,JProfiler即能對之進行設(shè)置,用戶即刻便能從設(shè)置好的JVM中看到實時數(shù)據(jù)。用戶若不想進行會話配置,其可以從多個IDE插件中選擇其最喜歡的那個對應用程序進行配置。 -
遠程會話實時分析模式
通過修改Java開始命令行方式的VM參數(shù),用戶可使任意Java應用程序監(jiān)聽來自的JProfiler GUI的連接。該設(shè)置程序不但可以在本地計算機上運行,還可以在網(wǎng)絡中作為某個設(shè)置程序的附加程序使用。此外,JProfiler還提供了相當多的集成向?qū)?,可用于主流的可以幫助用戶安裝和設(shè)置其應用程序的應用程序服務器。 -
離線分析模式
用戶無需通過JProfiler GUI連接應用程序即可對之進行設(shè)置。在離線設(shè)置模式下,用戶可以使用功能強大的JProfiler觸發(fā)系統(tǒng)或者JProfiler’ API對設(shè)置代理進行控制,然后將快照保存入磁盤。稍后用戶便可使用命令行導出工具或者螞蟻任務導出工具,在JProfiler GUI或編程方式的設(shè)置導出視圖中打開這些快照。 -
快照比較
在JProfiler中,用戶可以將當前的所有設(shè)置數(shù)據(jù)保存為一個快照存入磁盤中。JProfiler提供了豐富的比較功能以對比兩個或者多個快照之間的不同。用戶可從編程的命令行比較工具和ant task比較工具中選擇其一創(chuàng)建對比報告。 -
查看HPROF快照
JProfiler能打開用JVM工具(比如jconsole、 jmap或通過-XX:+HeapDumpOnOutOfMemoryError JVM參數(shù)觸發(fā))創(chuàng)建的HPROF快照文件
安裝
IEAR下載插件JPrifiler
安裝完插件記得重啟IDEA.出現(xiàn)下圖標準表示安裝成功
congqi官網(wǎng)下載JProfiler客戶端并安裝。 官網(wǎng)下載地址:https://www.ej-technologies.com/download/jprofiler/files
使用
生成快照
public class vmtest {
public static int i=1;
public static void main(String[] args) {
final long max= Runtime.getRuntime().maxMemory();//jvm的視圖使用的最大內(nèi)存
final long total = Runtime.getRuntime().totalMemory();//jvm初始化內(nèi)存
final int cpu = Runtime.getRuntime().availableProcessors();//cpu核數(shù)
/*-Xms10m -Xmx10m -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -Xss2m
* 表示配置jvm初始化內(nèi)存為10M,最大內(nèi)存為10M,打印GC詳細文件,生成錯誤文件
* */
System.out.println("虛擬機獲得最大內(nèi)存"+(max/1024/1024)+"m");
System.out.println("初始最大內(nèi)存"+(total/1024/1024)+"m");
System.out.println("本機核數(shù):"+cpu);
String s = new String();
while(true){
final byte[] bytes = new byte[1024 * 1024*1024];
}
}
}
配置VM
運行程序
我們預期效果達到,堆內(nèi)存超出。
打開項目目錄找到生成的快照,并用JProfiler工具打開
進入JProfiler
查看堆中的實例
查看在哪里報錯
本地運行
進入JProfiler
可以查程序運行時的實時數(shù)據(jù)
生成快照文章來源:http://www.zghlxwxcb.cn/news/detail-482642.html
進入JProfiler
可以查程序運行時的實時數(shù)據(jù)
生成快照
文章來源地址http://www.zghlxwxcb.cn/news/detail-482642.html
到了這里,關(guān)于【JVM 監(jiān)控工具】性能診斷--JProfiler的使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!