Java應用程式效能監控工具
阿新 • • 發佈:2019-01-01
簡介
當一個軟體系統完成基本功能上線執行後,如前期設計不佳,後面很容易出現記憶體和效能問題。解決這些問題有多種途徑,其中最為常用的方式:藉助監控工具,直接找到問題點(或某個範圍),然後仔細研究程式碼,找出根因並整改。本文僅對效能類問題做深入探討
當程式出現效能問題後,最直接的表現是:系統請求響應變慢、CPU持續居高不下,常見可能導致效能問題的操作:
1)頻繁的I/O操作(比如:網路,本地檔案讀寫); 2)頻繁的申請較大記憶體,導致系統頻繁Full GC; 3)由於程式自身bug,導致系統進入死迴圈或其它耗時邏輯中; 4)不當的鎖保護(力度過大),導致響應執行緒等待; 5)其它...
有些效能問題,只有系統上到一定的壓力下,才表現出來。為避免,就要求我們在日常的編碼中要勤思考
Java效能問題分析工具概述
- HPROF
Java自帶的分析工具,通過實現Java Virtual Machine Tool Interface(JVM TI),監控虛擬機器類載入、方法呼叫等事件,對其做資料收集,從而統計出效能資料。
- VisualVM
JDK自帶的分析工具,JDK_1.6.23之後的版本才帶著個工具,監控一段時間後,收集快照,可以找到耗時點
- jProfiler
一款商業工具,需要付費,但其功能非常強大,不僅可以分析效能問題,還可以分析諸如:記憶體洩露、執行緒同步等問題,該工具使用比較廣
- YourKit
類似jProfiler,需要付費,其功能沒有jProfiler強大,但執行速度更流暢些,具體沒使用過
監控方式
- 1)日誌:
通過System.currentTimeMillis(),在待檢測邏輯前後分別獲取系統時間戳,做差值計算後,輸出至控制檯或檔案; 其最大缺點是要該程式碼,對業務邏輯浸入大;
- 2)事件:
採用 JVMTI(JVM Tools Interface)API 來捕捉諸如方法呼叫、類載入、類解除安裝、進入/離開執行緒等事件,然後基於這些事件進行程式行為的分析,JVMTI需要使用C/C++編寫實現程式碼
- 3)抽樣(sampling):
每隔一段時間中斷系統,收集當前的呼叫棧資訊,基於這些資訊得到函式的呼叫關係圖及每個函式的 CPU 使用資訊; 缺點是:分析不是非常精確的,但幾乎不影響目標程式的執行速度。
- 4)位元組碼注入 (BCI)
在執行期,動態在目標程式中新增profiler邏輯片段,實時收集方法、記憶體等資訊; 缺點是:影響程式執行速度,但其統計的耗時百分比是比較準確的
PerfMonitorTool詳細介紹
本工具是基於方式4)位元組碼注入 (BCI)+javaagent技術實現,如下圖所示:
- Java agent:
主要作用是向JVM虛擬機器中註冊一個代理,從而可以監控類載入
- ASM:
是一種動態修改Java位元組碼技術,純Java實現,通過其提供的方法,可以在載入類過程中,完成對待監控類方法對應位元組碼的修改 [延伸]:bTrace也可以實現,其功能更強大
- 前期準備
1)安裝Bytecode Outline外掛: 在Eclipse中:"Help->EclipseMarketplace...”,查詢“Bytecode Outline”,點選安裝; 完成安裝後,我們就可以開啟該檢視,從而可以檢視java到ASM位元組碼之間的對映關係: 2)使用agent的類注意點: 需要在其jar包對應MANIFEST.MF檔案中新增如下屬性項:Premain-Class: com.ucweb.profile.Main,其中Main類中有如下簽名方法 public static void premain(String args, Instrumentation inst) agent包依賴ASM庫,在其jar包對應MANIFEST.MF檔案中新增如下屬性項: Class-Path: asm-all-3.3.1.jar 最終對應的MANIFEST.MF檔案內容大致如下:
- 原始碼路徑:
- 部署執行,請參考: