JProfiler性能分析工具
1.簡介
JProfiler是一個商業授權的Java剖析工具,用於分析Java EE和Java SE應用程序.
2.JVMTI
JDK 本身定義了目標明確並功能完善的JNI( Java Native Interface ) 與虛擬機直接進行交互,這些 API 能很方便的進行擴展,從而滿足開發者各式的需求.
JVMTI( JVM Tool Interface) ,是JAVA虛擬機提供的本地接口,它是實現調度器以及其它Java運行測試與分析工具的基礎.
*並不一定在所有的JDK提供商都有實現,但在主流的Oracle JDK、Open JDK上都有其實現.
*在開發的過程中一般是使用Agent的方式來使用JVMTI,通過調用JVMTI的函數,從JVM中得到當前的運行信息.
3.JProfiler內部模型
4.JProfiler數據采集的原理
1.用戶在JProfiler GUI中下達監控命令( 對應用戶的一個點擊 ).
2.JProfiler GUI通過自身Socket的8849端口向位於JVM的JProfiler Agent發送監控指令.
3.JProfiler Agent收到指令後向JVMTI註冊事件或執行相關的命令.
4.JVMTI根據事件和命令的類型返回相對應的數據( 線程狀態、對象實例、CPU負荷、GC狀態信息等)
5.JProfiler Agent從JVMTI中得到相應數據後將對其進行計算,最終通過Socket傳輸給JProfiler GUI中進行展示.
5.JProfiler的使用
5.1 安裝
https://www.ej-technologies.com/download/jprofiler/files
*Window操作系統請安裝9.X版本,輸入激活碼對軟件進行激活.
激活碼:[email protected]#23874-hrwpdp1sh1wrn#0620
*Linux操作系統無須激活
5.2 JProfiler與應用進行連接
1 與正在運行的JVM實例進行連接
Select from all local JVMs模式:將掃描本地所有正在運行的JVM實例
Attach to profiled JVM模式:選擇本地或遠程正在運行的JVM實例,遠程被監控的機器一定要預先安裝JProfiler.
*需指定遠程服務器的JProfiler的通訊端口
2 啟動一個新的JVM實例一並連接
*需要指定程序的啟動類( 包含main方法的類 )
3 與Server進行集成( 需與服務捆綁 )
步驟一:Session-->Integration Wizards-->New Server Integration
步驟二:選擇應用服務器的類型以及版本號
步驟三:選擇與本地或遠程服務器的服務進行集成
*本文將使用遠程服務器模式.
*若選擇與遠程服務器的服務進行集成則需要選擇遠程服務器的操作系統類型.
步驟四:選擇服務器使用的JVM供應商以及版本號
步驟五:選擇JProfiler的啟動模式
Wait for JProfiler GUI模式
JVM將等待JProfiler Agent接收到JProfiler GUI發送的配置信息後再進行啟動( 即Lauch Type連接模式 ,啟動一個新的JVM實例)
Prepare for profling模式
立即啟動JVM,稍後再與JProfiler GUI進行連接並向JProfiler Agent發送配置信息( 數據的采集方式、過濾器、觸發器等信息 )
*若使用此模式則需要讓JVM在啟動時自動加載JProfiler Agent,因此需要在startup.bat/startup.sh文件中添加命令
startup.bat:set CATALINA_OPTS=-agentpath:{JProfiler安裝目錄}\bin\windows-x64\jprofilerti.dll=port=8849,nowait %CATALINA_OPTS%
startup.sh:CATALINA_OPTS=-agentpath:/{JProfiler安裝目錄}/bin/linux-x64/libjprofilerti.so=port=8849,nowait $CATALINA_OPTS
export CATALINA_OPTS
Profile Offine模式
離線分析,JProfiler GUI無法與JProfiler Agent進行連接,因此需要將數據的采集方式、過濾器、觸發器等信息打包成config.xml配置文件,在啟動該JVM實例時加載JProfiler Agent以及配置文件,使用此模式需要配合triggers觸發器使用,當發生指定的事件後觸發指定的操作.
* 若使用此模式則需要讓JVM在啟動時自動加載JProfiler Agent和context.xml配置文件,因此需要在startup.bat/startup.sh文件中添加命令
startup.bat:set CATALINA_OPTS=-agentpath:{JProfiler安裝目錄}\bin\windows-x64\jprofilerti.dll=port=8849,nowait,config=C:\Users\{用戶名}\.jprofiler9\config.xml %CATALINA_OPTS%
startup.sh:CATALINA_OPTS=-agentpath:/{JProfiler安裝目錄}/bin/linux-x64/libjprofilerti.so=port=8849,config={預定義目錄}\config.xml $CATALINA_OPTS
export CATALINA_OPTS
步驟六:填寫遠程服務器的IP地址
步驟七:輸入遠程服務器中JProfiler的安裝目錄( 供JProfiler生成腳本時使用 )
步驟八:選擇應用服務器的啟動腳本,JProfiler會根據選擇的啟動腳本文件生成一份適用於JProfiler特定啟動模式的腳本文件.
*最終在本地生成startup_jprofiler.sh文件,需將此文件復制到遠程服務器中應用服務器的bin目錄並對文件賦予執行的權限,在服務器中直接通過JProfiler提供的startup_jprofiler.sh文件來啟動服務.
*若使用離線啟動模式則還需要將JProfiler生成的context.xml配置文件復制到遠程服務器中,然後修改startup_jprofiler.sh文件中JVM加載context.xml文件的路徑.
步驟九:設置JProfiler GUI通訊的端口
步驟十:檢查配置項
步驟十一:選擇數據的采集方式
Instrumentation重構模式
JProfiler將對需要分析的class字節碼文件中寫入自己的bytecode,對於正在運行的JVM實例選擇此模式將會重新加載字節碼文件到JVM的運行時數據區域結構中.
*這是JProfiler全功能模式,在此設置中,調用堆棧信息是準確的,但是CPU開銷可能很高( 取決於Filter的控制 ),若要分析的類較多,則對應用的性能產生影響,因此使用此模式一般配合Filter使用,只對特定的類或包進行分析.
Sampling抽樣模式
此模式對CPU的開銷非常低,但不支持某些功能( 方法的執行次數、執行時間等 ), 這種模式在連接正在運行的JVM實例時更為安全.
步驟十二:選擇配置Filter和Trigger
配置Filter( 適用於Instrumentation數據采集模式 )
配置Trigger( 多用在離線的啟動模式 )
1.選擇觸發器的類型
2.選擇觸發的動作
步驟十三:完成配置,連接JProfiler Agent,對程序進行監控.
*每個Session表示一次會話,Session可以通過人工創建 ( New Session ) 或者與服務應用進行集成來產生( Integration Wizards ).
*支持將當前JVM實例的運行狀態保存為快照( Save Snapshot )並提供快照與快照之間的對比功能.
5.3 視圖介紹
Telemetries視圖:包含JMM內存的使用情況( 全局堆與非堆、局部伊甸園區、幸存者區、老年代)、GC線程的活動情況( 發生GC的時間,是屬於Minor GC還是Full GC )、當前JVM實例的線程概況、CPU的負載等信息.
Live Memory視圖:展示當前堆中實例的個數、方法的調用鏈等信息.
方法調用鏈信息:
Heap Walker視圖:用於堆的快照分析,可以選擇在Live Memory中記錄的對象或者當前運行狀態時堆的對象也可以直接在對象視圖右鍵對象Show Selection In Heap Walker.
CPU Views視圖:可以按運行順序逐級查看當前程序運行時的耗時、在一定時間內統計方法的執行效率.
程序運行耗時:
一定時間內統計方法的執行效率( 單位:微秒 ):
Total Time:執行總時長.
Inv:執行的次數.
Avg Time:方法平均執行時長.
Median Time:第中間次數的執行時長.
Min Time:最短執行時長.
Max Time:最大執行時長.
JProfiler性能分析工具