測試Btrace筆記

測試Btrace筆記

 - 編寫.java文件 NumberUtil.java
   javac NumberUtil.java 編譯class  Number.class
   java NumberUtil 執行class文件。
 - 打開visualVm檢測jvm進程
 - 根據你當前的Jdk版本選擇對應的visualVm,根據的visualvm版本選擇正確的插件,在安裝btrace有關的插件時會遇到插件依賴的情況請根據提示到官方的插件中心下載插件安裝包,然後線下安裝Plugin。
 - 之後btrace插件會提高workbench讓你舒服的編寫監聽腳本。
 - 以下是別人對btrace的理解

> BTrace 是一個事後工具,所謂事後工具就是在服務已經上線了,但是發現存在以下問題的時候,可以用 BTrace。
> 1.比如哪些方法執行太慢,例如監控執行時間超過1s的方法
> 2.查看哪些方法調用了 System.gc() ,調用棧是怎樣的
> 3.查看方法參數或對象屬性
> 4.哪些方法發生了異常
>多說一點,爲了更好解決問題,最好還要配合事前準備和進行中監控,事前準備就是埋點嘛,在一些可能出現問題的方法中進行日誌輸出,進行中監控就是利用一些實時監控工具,例如 VisualVM 、jmc 這些帶界面的工具或者 jdk >提供的命令行工具等,再高級一點的就是利用 Graphite 這樣的Metrics 工具配合 web 界面展示出來。

 - 事實這樣理解是正確的,因爲visualVM也是把btrace插件歸類未Profiler工具
 - 本例的代碼:
 本例主要是針對所有java方法都有的返回值slot進行監聽(什麼是返回值的slot,這得了解JVM知識了。這裏簡單科普一下:在執行return指令的時候,會先把需要返回的變量(基本數據類型或者引用)放入棧頂,然後再執行return指令,return會把棧頂的數據作爲函數的結果返回。如果函數中有finally語塊,這個過程就不那麼簡單了,因爲程序在執行return命令之前會先把棧頂結果保存到本地內存slot數組中,然後再進入到Finally的代碼塊執行finally代碼,如果finally沒有return指令,那麼finally執行完了之後會跳轉到原來return語句的前一行指令,把之前保存到slot數組的數據還原回棧頂,再然後在執行return 語句**【重要知識點!】)
 ```java
 
 /* BTrace Script Template */
import com.sun.btrace.annotations.*;
import static com.sun.btrace.BTraceUtils.*;

/* BTrace Script Template */
import com.sun.btrace.annotations.*;
import static com.sun.btrace.BTraceUtils.*;
import com.sun.btrace.BTraceUtils;

@BTrace
public class TracingScript {
    /* put your code here */
    @OnMethod(
            clazz="NumberUtil", // 聲明目標類
            method="sum",       // 聲明目標方法
            location=@Location(Kind.RETURN) //聲明攔截的指令位置
    )
    public static void func(@Return int result) {   //對指令上下文監聽
        println("trace: =======================");
        println(BTraceUtils.Time.timestamp("yyyy-MM-dd HH:mm:ss")); // 打印時間
        println(strcat("result:", str(result)));
        jstack();
    }
}
 
 ```
 執行btrace script後的輸出結果:
 ** Compiling the BTrace script ...
*** Compiled
** Instrumenting 1 classes ...
*** Done
** BTrace up&running

*** Done
** BTrace up&running

trace: =======================
result:328350
NumberUtil.sum(NumberUtil.java:15)
NumberUtil.main(NumberUtil.java:22)
trace: =======================
result:328350
NumberUtil.sum(NumberUtil.java:15)
NumberUtil.main(NumberUtil.java:22)

 - 由於btrace的使用場景比較有限,對於不確定能否成功的場景可以寫demo多練習,不需要貿然到生產去測試。
 - 本地試玩了btrace後,把NumberUtil JVM進程部署到遠程服務器,然後練習遠程btrace,發現行不通。因爲官方暫時沒有提供基於RMI的服務接口。也就說Btrace只能檢測本地JVM進程,另外Btrace修改的是線上內容的JVM字節碼,這個修改是不可逆的,除非重啓JVM,之後會重新加載最初的字節碼(被修改前的)。
 
 
 

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