1. 程式人生 > 程式設計 >Java軟體生產監控工具Btrace使用方法詳解

Java軟體生產監控工具Btrace使用方法詳解

Btrace

BTrace是sun公司推出的一款Java 動態、安全追蹤(監控)工具,可以在不用重啟的情況下監控系統執行情況,方便的獲取程式執行時的資料資訊,如方法引數、返回值、全域性變數和堆疊資訊等,並且做到最少的侵入,佔用最少的系統資源。

專案地址:Btrace

使用者指南:UserGuide

Btrace使用

在Release頁面裡下載最新Zip版,解壓就能用

tar -zxvf btrace-bin-1.3.8.3.tgz
export JAVA_HOME=/opt/taobao/java
export PATH=$JAVA_HOME/bin:$PATH

./bin/btrace -cp /home/admin/projectname/target/projectname/BOOT-INF/classes 2016 SlowCall.java

./bin/btrace -cp /home/admin/projectname/target/projectname.war/WEB-INF/classes:/home/admin/projectname/target/projectname.war/WEB-INF/lib/projectname-1.0-SNAPSHOT.jar 71419 BtraceTest.java > NT12.txt

由於Btrace會把指令碼邏輯直接侵入到執行的程式碼中,所以在使用上做很多限制:

1、不能建立物件

2、不能使用陣列

3、不能丟擲或捕獲異常

4、不能使用迴圈

5、不能使用synchronized關鍵字

6、屬性和方法必須使用static修飾

根據官方宣告,不恰當的使用BTrace可能導致JVM崩潰,如在BTrace指令碼使用錯誤的class檔案,所以在上生產環境之前,務必在本地充分的驗證指令碼的正確性。

Btrace可以做什麼?

1、介面效能變慢,分析每個方法的耗時情況;

2、當在Map中插入大量資料,分析其擴容情況;

3、分析哪個方法呼叫了System.gc(),呼叫棧如何;

4、執行某個方法丟擲異常時,分析執行時引數;

5、....

Btrace第一個例子

package com.metty.rpc.common;
import java.util.Random;

public class BtraceCase {
  public static Random random = new Random();
  public int size;

  public static void main(String[] args) throws Exception {
    new BtraceCase().run();
  }
  
  public void run() throws Exception {
    while (true) {
      add(random.nextInt(10),random.nextInt(10));
    }
  }

  public int add(int a,int b) throws Exception {
    Thread.sleep(random.nextInt(10) * 100);
    return a + b;
  }
}

執行add方法時,對傳入引數、返回值以及執行耗時進行分析,btrace指令碼:

Java軟體生產監控工具Btrace使用方法詳解

通過jps命令獲取pid為8454

執行btrace 8454 Debug.java實現對執行程式碼的監控,輸出結果如下:

Java軟體生產監控工具Btrace使用方法詳解

可以發現,Btrace可以獲取每次執行add方法時的資料,當然Btrace能做的遠遠不止這些,比如獲取當前jvm堆使用情況、當前執行緒的執行棧等等。

引數說明

@OnMethod

Btrace使用@OnMethod註解定義需要分析的方法入口

Java軟體生產監控工具Btrace使用方法詳解

在@OnMethod註解中,需要指定class、method以及location等,class表明需要監控的類,method表明需要監控的方法,指定方式如下:

1、使用全限定名:clazz="com.metty.rpc.common.BtraceCase",method="add"

2、使用正則表示式:clazz="/javax\\.swing\\..*/",method="/.*/"

3、使用介面:clazz="+com.ctrip.demo.Filter",method="doFilter"

4、使用註解:clazz="@javax.jws.WebService",method=""@javax.jws.WebMethod"

5、如果需要分析構造方法,需要指定method="<init>"

@Location

定義Btrace對方法的攔截位置,通過@Location註解指定,預設為Kind.ENTRY

1、Kind.ENTRY:在進入方法時,呼叫Btrace指令碼

2、Kind.RETURN:方法執行完時,呼叫Btrace指令碼,只有把攔截位置定義為Kind.RETURN,才能獲取方法的返回結果@Return和執行時間@Duration

Java軟體生產監控工具Btrace使用方法詳解

3、Kind.CALL:分析方法中呼叫其它方法的執行情況,比如在execute方法中,想獲取add方法的執行耗時,必須把where設定成Where.AFTER

Java軟體生產監控工具Btrace使用方法詳解

4、Kind.LINE:通過設定line,可以監控程式碼是否執行到指定的位置

Java軟體生產監控工具Btrace使用方法詳解

5、Kind.ERROR,Kind.THROW,Kind.CATCH

用於對某些異常情況的跟蹤,包括異常丟擲,異常被捕獲,異常未捕獲被丟擲方法之外

如何使用Btrace定位問題
1、找出所有耗時超過1ms的過濾器Filter

Java軟體生產監控工具Btrace使用方法詳解

由於@Dutation返回的時間是納秒級別,需要進行轉換,如果定位一個Filter效能變慢,接著使用@Location(Kind.CALL)進行更細粒度的分析。

2、分析哪個方法呼叫了System.gc(),呼叫棧如何?

Java軟體生產監控工具Btrace使用方法詳解

通過檢視呼叫棧,可以很清楚的發現哪個類哪個方法呼叫了System.gc()

3、統計方法的呼叫次數,且每隔1分鐘列印呼叫次數

Java軟體生產監控工具Btrace使用方法詳解

Btrace的@OnTimer註解可以實現定時執行指令碼中的一個方法

4、方法執行時,檢視物件的例項屬性值

Java軟體生產監控工具Btrace使用方法詳解

通過反射機制,可以很方法的得到當前例項的屬性值

總結

Btrace能做的事情太多,但使用之前切記檢查指令碼的可行性,一旦Btrace指令碼侵入到系統中,只有通過重啟才能恢復。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。