Java性能利器-Jprofiler

1. JProfiler概覽

    1. 使用簡單
    1. 低開銷,對應(yīng)用影響小
    1. 支持對JDBC、JPA和NoSQL的數(shù)據(jù)庫分析
    1. CPU,Thread,Memory分析功能尤其強大
    1. 支持多種IDE和應(yīng)用服務(wù)器
    1. 支持多種模式離線和在線的分析
    1. 跨平臺(Linux,Windows,Mac,Solaris,AIX,HP-UX)
  • 官網(wǎng):https://www.ej-technologies.com/products/jprofiler/overview.html

2. Jprofiler采集流程和架構(gòu)

采集流程
  • image.png
    1. JProfiler GUI中下達監(jiān)控的指令
    1. JProfiler GUI 通過socket發(fā)送指令給被剖析jvm中的JProfile Agent
    1. JProfiler Agent收到指令后,將該指令轉(zhuǎn)換成相關(guān)需要監(jiān)聽的事件或者指令,來注冊到JVMTI上或者直接讓JVMTI去執(zhí)行某功能(例如dump jvm內(nèi)存)
    1. JVMTI 根據(jù)注冊的事件,來收集當前jvm的相關(guān)信息。 例如: 線程的生命周期和狀態(tài);對象實例的生命周期;堆內(nèi)存的實時信息等等
    1. JProfiler Agent將采集好的信息保存到內(nèi)存中,按照一定規(guī)則統(tǒng)計好,通過socket發(fā)送給JProfiler GUI
    1. JProfiler GUI Render 渲染成最終的展示效果

Jrofiler架構(gòu)

  • image.png

3. 啟動模式

Attach mode

對于剖析Java1.6或更高版本,JProfiler支持連接到一個正在運行的JVM并加載剖析代理。不過鏈接模式也有一些缺點,因為分析界面的一些功能在鏈接模式下無法使用,如下圖,LiveMemory提示無法顯示數(shù)組的分配情況。

image.png
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

  1. 一般用于適用于不能直接調(diào)試線上的場景。Offline profiling需要將信息采集內(nèi)容和觸發(fā)策略打包成一個配置文件config.xml,在線上啟動該jvm 加載 JProfiler Agent時,加載該xml。那么JProfiler Agent會根據(jù)Trigger的類型會生成不同的信息。例如: heap dump; thread dump; method call record等

  2. 語法

|

-agentpath:/home/2080/jprofiler8/bin/linux-x64/libjprofilerti.so=offline,id=151,config=/home/2080/config.xml

|

  1. 下面是使用了離線模式,并使用了每隔一秒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支持更多的功能,使用也方便

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容