1. 程式人生 > >Java應用程式效能監控工具

Java應用程式效能監控工具

簡介

當一個軟體系統完成基本功能上線執行後,如前期設計不佳,後面很容易出現記憶體和效能問題。解決這些問題有多種途徑,其中最為常用的方式:藉助監控工具,直接找到問題點(或某個範圍),然後仔細研究程式碼,找出根因並整改。本文僅對效能類問題做深入探討

當程式出現效能問題後,最直接的表現是:系統請求響應變慢、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檔案內容大致如下:
  • 原始碼路徑:
  • 部署執行,請參考:

參考資料