1. JProfiler概覽
- 使用簡單
- 低開銷,對應(yīng)用影響小
- 支持對JDBC、JPA和NoSQL的數(shù)據(jù)庫分析
- CPU,Thread,Memory分析功能尤其強大
- 支持多種IDE和應(yīng)用服務(wù)器
- 支持多種模式離線和在線的分析
- 跨平臺(Linux,Windows,Mac,Solaris,AIX,HP-UX)
- 官網(wǎng):https://www.ej-technologies.com/products/jprofiler/overview.html
2. Jprofiler采集流程和架構(gòu)
采集流程
- image.png
- JProfiler GUI中下達監(jiān)控的指令
- JProfiler GUI 通過socket發(fā)送指令給被剖析jvm中的JProfile Agent
- JProfiler Agent收到指令后,將該指令轉(zhuǎn)換成相關(guān)需要監(jiān)聽的事件或者指令,來注冊到JVMTI上或者直接讓JVMTI去執(zhí)行某功能(例如dump jvm內(nèi)存)
- JVMTI 根據(jù)注冊的事件,來收集當前jvm的相關(guān)信息。 例如: 線程的生命周期和狀態(tài);對象實例的生命周期;堆內(nèi)存的實時信息等等
- JProfiler Agent將采集好的信息保存到內(nèi)存中,按照一定規(guī)則統(tǒng)計好,通過socket發(fā)送給JProfiler GUI
- JProfiler GUI Render 渲染成最終的展示效果
Jrofiler架構(gòu)
- image.png
3. 啟動模式
Attach mode
對于剖析Java1.6或更高版本,JProfiler支持連接到一個正在運行的JVM并加載剖析代理。不過鏈接模式也有一些缺點,因為分析界面的一些功能在鏈接模式下無法使用,如下圖,LiveMemory提示無法顯示數(shù)組的分配情況。

Remote Attach mode
- 1. 啟動要分析的進程
啟動命令中不需要設(shè)置任何和agentlib有關(guān)的參數(shù)
- 2. 在遠程主機運行jpenable
選擇要分析的進程,模式和監(jiān)聽的端口號
3. 在本地啟動jprofiler gui
Profile at startup
若要在啟動時分析應(yīng)用程序,在創(chuàng)建JVM前就必須激活剖析代理,將指定的JProfiler Agent手動加載到被剖析jvm。JProfiler GUI 將收集信息類型和策略等配置信息通過socket發(fā)送給JProfiler Agent,收到這些信息后該jvm才會啟動。在被分析的jvm 的啟動參數(shù)增加下面內(nèi)容:語法: -agentpath:[path to jprofiler library]
java -agentpath:/home/linux-x64/libjprofilerti.so=port=8849 -jar /home/frank/test.jar|
Prepare for profiling:
和Profile at startup的主要區(qū)別:被分析的jvm不需要收到JProfiler GUI 的相關(guān)配置信息就可以啟動, 只需要加一個nowait啟動參數(shù)即可
Offline profiling
一般用于適用于不能直接調(diào)試線上的場景。Offline profiling需要將信息采集內(nèi)容和觸發(fā)策略打包成一個配置文件config.xml,在線上啟動該jvm 加載 JProfiler Agent時,加載該xml。那么JProfiler Agent會根據(jù)Trigger的類型會生成不同的信息。例如: heap dump; thread dump; method call record等
語法
|
-agentpath:/home/2080/jprofiler8/bin/linux-x64/libjprofilerti.so=offline,id=151,config=/home/2080/config.xml
|
- 下面是使用了離線模式,并使用了每隔一秒dump heap 的Trigger:
· [[圖片上傳失敗...(image-d433d4-1543051624595)]](javascript:;)
4. 數(shù)據(jù)采集方式
JProfiler采集方式分為兩種:Sampling和Instrumentation
Sampling
類似于樣本統(tǒng)計, 每隔一定時間(5ms)將每個線程棧中方法棧中的信息統(tǒng)計出來。優(yōu)點是對應(yīng)用影響小,缺點是一些數(shù)據(jù)/特性不能提供(例如:方法的調(diào)用次數(shù))
Instrumentation
在class加載之前,JProfier把相關(guān)功能代碼寫入到需要分析的class中,對正在運行的jvm有一定影響。優(yōu)點: 功能強大,但如果需要分析的class多,那么對應(yīng)用影響較大,一般配合Filter一起使用。所以一般JRE class和framework的class是在Filter中通常會過濾掉。
5. JProfiler核心概念
Filter
什么class需要被分析。分為包含和不包含兩種類型的Filter。
Profiling Settings
收據(jù)收集的策略:Sampling和 Instrumentation,一些數(shù)據(jù)采集細節(jié)可以自定義.
Triggers
一般用于offline模式,告知JProfiler Agent 什么時候觸發(fā)什么行為來收集指定信息.
Live memory:
class/class instance的相關(guān)信息。 例如對象的個數(shù),大小,對象創(chuàng)建的方法執(zhí)行棧,對象創(chuàng)建的熱點。
Heap walker
對一定時間內(nèi)收集的內(nèi)存對像信息進行靜態(tài)分析,功能強大且使用。包含對象的outgoing reference, incoming reference, biggest object等
CPU views
CPU消耗的分布及時間(cpu時間或者運行時間); 方法的執(zhí)行圖; 方法的執(zhí)行統(tǒng)計(最大,最小,平均運行時間等)
Thread
當前jvm所有線程的運行狀態(tài),線程持有鎖的狀態(tài),可dump線程
Monitors & locks
所有線程持有鎖的情況以及鎖的信息
Telemetries:
包含heap, thread, gc, class等的趨勢圖(遙測視圖)
6. 實踐
內(nèi)存泄露
- Live memory->All Objects,顯示當前進程的對象的類型、數(shù)量和占用內(nèi)存大小
- Live memory->Recored Objects,開始記錄新生成的對象
- Heap warlker,跟蹤生成對象的調(diào)用棧
- 根據(jù)調(diào)用棧找到生成對象的位置,即可分析到內(nèi)存泄露的原因
CPU利用率高
- 調(diào)用樹
- 熱點區(qū)域圖,顯示當前進程不同方法調(diào)用占用CPU的比率,點擊CPU占用率最高的方法,展開的調(diào)用樹可以定位到哪行代碼最消耗CPU資源
7. 和其他工具的對比
常用Java分析圖形工具有Jprofiler、Jconsole、VisualVm和YourKit,還有jdk自帶命令行工具jstack、jmap和jstat等等,命令行工具只能分析進程在某一個時間點的狀態(tài),相當于拍了一張照片,對于像死鎖,CPU占用率100%的問題,比較好處理,命令行工具的優(yōu)勢是分析線上環(huán)境,而圖形界面工具能夠分析進程在一段時間內(nèi)的狀態(tài),相當于拍了一段視頻,圖形界面的優(yōu)勢在于快速直觀的分析問題,更多的情況,我們結(jié)合命令行工具和圖形界面工具處理問題。與其他圖形界面工具的對比如下:
IDE Integration
Jprofiler和YourKit支持與常用的集成開發(fā)工具集成,VisualVM需要通過插件的方式要集成開發(fā)工具集成
Memory + Memory Leak Analysis
都支持內(nèi)存分析,Jprofler和youkit都能顯示對象的個數(shù),占用大小,以及生成對象的調(diào)用關(guān)系
CPU Profiling
都支持熱點區(qū)域分析,而jprofiler能夠通知指定時間段方法的執(zhí)行次數(shù)
Database Statement Monitoring
Jprofiler和yourkit支持jdbc statement的分析,而VisualVM和jconsole不支持這種功能
Remote profiling
VisualVM是通過JMX采集遠程應(yīng)用的信息,jprofiler和Yourkit是通過遠程代理加socket方式采集遠程應(yīng)用的信息
Summary
Jprofiler支持更多的功能,使用也方便

