JProfiler學習筆記

轉自https://blog.gmem.cc/jprofiler-study-note
內存視圖(Memory Views)

該視圖專注於對象的內存分配情況,包含以下選項卡:

 All Objects 顯示堆中實時的對象情況:顯示某種類型(聚合級別可以是類、包等)對象的數量(Instance Count)、淺尺寸(Shallow size)關於淺尺寸的計算:

 

  1. 普通對象大小的計算不包括引用、類變量,由變量本身地址、基本類型的變量佔用的內存等組成
  2. 數組整體計算,不分爲單個元素計算大小/數量

注意,有些對象雖然沒有引用,但是可能沒被GC回收,可以手工Run GC

右擊某一類型,可以轉到Class Tracker或者Heaper Walker視圖

Recorded Objects 顯示已經進行記錄的對象。與All Objects相比,可以查看對象分配調用樹(Allocation Call Tree)、分配熱點(Allocation Hot Sports)點擊工具欄:Start Memory,可以錄製對象分配
Allocation Call Tree 顯示選中的、已錄製對象類型的分配調用數,分析調用棧的哪些棧幀比較消耗資源。從線程執行開始處,一直追溯到對象被創建的地方,對象佔用內存的大小被顯示,效果如下圖:
Allocation Hot Sports 顯示選中的、已錄製對象類型的分配熱點:以創建對象的方法爲根顯示調用樹,效果如下圖:alloc-hotsopt
Class Tracker  顯示選中類型對象的實例個數的曲線圖(按時間)
堆遍歷(Heap Walker)

該視圖用於靜態分析堆快照,在生成快照之前,會進行一次Full GC。包含以下選項卡:

Classes 類似於Memory Views的All Objects,可以顯示快照中所有對象的數量、大小。右擊選擇Use Selected Instances,則可以顯示單種類型的數據
Allocations 分析對象分配情況:包括4種顯示方式:Cumulated Allocation Tree:累積調用樹,顯示對象分配調用樹,包含對象sizeAllocation Tree:調用樹,顯示對象分配調用樹,包含對象sizeAllocation Tree Map:以Tree Map形式顯示調用樹Allocation Hot spots:顯示分配對象最多的方法
Biggest Objects 顯示佔用內存最多的對象
References 顯示單種類型的引用情況包含4種顯示方式:Incoming references:其它對象對每一個選中對象的引用Outcoming references:每一個選中對象對其它對象的引用Cumulated Incoming references:顯示其它對象、字段對選中對象類型的總體引用統計Cumulated Outcoming references:顯示選中對象類型對其它對象、字段的總體引用統計
Time 分析對象分配的消耗時間
Inspections 提供多種精細的對象分配分析方式
Graph 圖形化方式顯示對象的引用圖
CPU視圖(CPU Views)

該視圖用於分析方法的CPU佔用時間,包括以下選項卡:

 Call Tree 顯示自頂而下的調用堆棧的樹,樹的根是線程開始處,樹的分叉表示的不同的調用路徑。暗紅色顯示當前節點及其子節點消耗的時間、高亮紅色顯示本級節點消耗的時間。

 

顯示未過濾類對過濾類的直接調用,不顯示深入的調用,在被過濾類的左上角顯示紅三角。main方法、線程的run方法總是顯示,不予過濾。
通過Profiling Settings可以選擇CPU時間的度量方式:Elapsed time/Estimated CPU time,前者爲Wall clock time(物理世界真實時間),後者爲佔用CPU的時間。由於操作系統的固有限制,10ms以下的時間可能不具有統計學意義。
界面右上角的Thread Status用於選擇參與分析的線程狀態,通常選擇Runnable來分析性能問題,有時可以結合Net I/O、Blocked
 
工具欄Start Tracking,可以追蹤某些任務在不同線程之間的傳遞(調用點/執行點Call site/Execution site)

效果如下圖:
call-tree

 Hot Spots 顯示耗時最高的方法調用,顯示消耗時間、平均消耗時間、調用次數等字段,以耗時方法爲根,可以追溯到線程啓動處Filtered Classes設置:選擇被過濾類佔用時間,可以單獨列出,或者算在調用它的元素上(main、線程run不能過濾)
每個方法可能被多個調用棧調用,百分比顯示不同調用棧對此方法的固有時間的“貢獻”
不顯示Total time,只顯示Inherent Time
Call Graph 顯示方法調用的序列,包括某個方法的調用與被調用情況
Method Stat 點擊工具欄圖標,可以錄製方法的統計信息並進行分析
Call Tracer 點擊工具欄圖標,可以對方法調用進行跟蹤
線程視圖(Thread Views)

該視圖用於分析線程的狀態和歷史分析、檢測死鎖,並可以獲取線程快照,包含以下選項卡:

Thread History 線程狀態時間線,可以選擇顯示活着的或者死去的線程

 

綠色:Runnable:表示線程可以接受CPU調度,但不一定正在佔用CPU,和線程優先級、調度算法、系統負載有關
黃色:Waiting:表示線程正在睡眠(java.lang.Thread.Sleep),或者在監視器上等待(java.lang.Object.wait),前者不會放棄佔有的監視器
紅色:Blocked:表示線程被阻塞,正在積極嘗試進入同步區
淺藍色:Net I/O:線程正在等待網絡操作的完成,監聽Socket或者讀寫Socket時產生此狀態
效果圖如下:
thread-history
Thread Monitor 顯示線程的開始結束時間、父線程、狀態等信息
Thread Dumps 獲取線程快照,可以分析瞬時系統各線程的調用棧
監視器視圖(Monitor Views)

該視圖用於鎖狀態檢測,包含以下選項卡:

 Current Locking Graph 當前鎖狀態圖,顯示監視器、以及在監視器上等待的線程。

 

黑色箭頭表示當前擁有此監視器的線程

紅色虛線表示被阻塞的線程(積極嘗試獲得鎖)

黃色箭頭表示在監視器上等待的線程(java.lang.Object.wait)

效果圖如下:

current-monitor

Current Monitors 顯示當前活動的監視器,包括監視器狀態、監視器類、等待線程、擁有者線程等信息
Locking History Graph 可以錄製監視器鎖定的歷史
Monitor History 可以顯示所有監視器的歷史
Monitor Usage Stat 以監視器、線程等方式分組,顯示監視器的使用統計,包括阻塞次數、阻塞持續時間、等待次數、等待持續時間等
虛擬機遙感視圖(VM Telemetry Views)

該視圖可以顯示時間線上的系統宏觀信息,包括以下選項卡:

Memory 顯示已有、空閒內存的區域圖
Recorded Objects 顯示堆中對象(數組、非數組)的數量
Recorded Throughput 顯示已記錄對象的創建和銷燬數量
GC Activity 顯示GC活動率百分比
Classes 顯示加載的類的數量
Threads 顯示處於各種狀態的線程的數量
CPU Load 顯示CPU負載百分比
JavaEE以及探針(JEE & Probes)

可以使用多種探針來檢測不同的應用領域,包括:JDBC、JPA/Hibernate、JNDI、JMS、Servlet、RMI、Socket、WebServices、Files等。

剖析配置
觸發器

用於在特定條件下觸發剖析動作
觸發條件:方法被調用、堆使用閾值、CPU使用率閾值、內存溢出異常、定時器、虛擬機啓動、虛擬機關閉等
剖析動作:啓/停錄製、調用跟蹤、監視器跟蹤,觸發堆dump、線程dump,啓/停探針錄製,保存快照,保存HPROF快照,運行腳本等

離線剖析

使用場景:腳本啓動剖析、定期快照保存、剖析遠程服務器

Session ID:需要指定id=xxx參數來激活相應的Profiling Settings,此ID顯示在Session Settings - Application Settings的左上角,如果配置文件中只包含一個Session,則不需要配置。
配置文件位置:可以指定config=xxx.xml,來指明設置的存放位置,默認是~/.jprofiler7/config.xml
離線剖析命令行樣例:

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章