日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

利用btrace在线监控java程序状态

發布時間:2025/3/18 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 利用btrace在线监控java程序状态 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

利用btrace在線監控java程序狀態 ?

btrace介紹

????? 下載地址: https://kenai.com/projects/btrace/downloads/directory/releases/

????? 選擇版本進行下載,這里下載的是 release-1.2.4 / btrace-bin.zip

????? 這兩天在調試程序時,發現一個比較好用的工具-btrace,能夠線上監控程序狀態,獲取運行時數據信息,如方法返回值,參數,調用次數,全局變量,調用堆棧等。


btrace命令行使用

????? 位于bin目錄下面主要有6個腳本,3個windows的,另外3個是linux的,分別是btrace、btracec、btracer。具體功能如下:

????? 1、btrace

功能: 用于運行BTrace跟蹤程序。
命令格式:
???????? btrace [-I <include-path>] [-p <port>] [-cp <classpath>] <pid> <btrace-script> [<args>]
示例:
????????? btrace -cp build/? 1200 AllCalls1.java
參數含義:
??????? include-path指定頭文件的路徑,用于腳本預處理功能,可選;
??????? port指定BTrace agent的服務端監聽端口號,用來監聽clients,默認為2020,可選;
??????? classpath用來指定類加載路徑,默認為當前路徑,可選;?
????????pid表示進程號,可通過jps命令獲取;
??????? btrace-script即為BTrace腳本;btrace腳本如果以.java結尾,會先編譯再提交執行。可使用btracec命令對腳本進行預編譯。
?????? args是BTrace腳本可選參數,在腳本中可通過"$"和"$length"獲取參數信息。

???? 2. btracec


功能: 用于預編譯BTrace腳本,用于在編譯時期驗證腳本正確性。
??????? btracec [-I <include-path>] [-cp <classpath>] [-d <directory>] <one-or-more-BTrace-.java-files>
參數意義同btrace命令一致,directory表示編譯結果輸出目錄。

3. btracer?


功能: btracer命令同時啟動應用程序和BTrace腳本,即在應用程序啟動過程中使用BTrace腳本。而btrace命令針對已運行程序執行BTrace腳本。
命令格式:
?????? btracer <pre-compiled-btrace.class> <application-main-class> <application-args>
參數說明:
?????? pre-compiled-btrace.class表示經過btracec編譯后的BTrace腳本。
?????? application-main-class表示應用程序代碼;?
?????? application-args表示應用程序參數。?
?????? 該命令的等價寫法為:?
????????????? java -javaagent:btrace-agent.jar=script=<pre-compiled-btrace-script1>[,<pre-compiled-btrace-script1>]*??????? <MainClass> <AppArguments>

?

btrace腳本限制

In particular, a BTrace class

  • can not create new objects.
  • can not create new arrays.
  • can not throw exceptions.
  • can not catch exceptions.
  • can not make arbitrary instance or static method calls - only the public static methods of com.sun.btrace.BTraceUtils class may be called from a BTrace program.
  • can not assign to static or instance fields of target program's classes and objects. But, BTrace class can assign to it's own static fields ("trace state" can be mutated).
  • can not have instance fields and methods. Only static public void returning methods are allowed for a BTrace class. And all fields have to be static.
  • can not have outer, inner, nested or local classes.
  • can not have synchronized blocks or synchronized methods.
  • can not have loops ( for, while, do..while)
  • can not extend arbitrary class (super class has to be java.lang.Object)
  • can not implement interfaces.
  • can not contains assert statements.
  • can not use class literals.

?

?

jvisualvm 插件

BTrace提供了jvisualvm插件,強烈推薦在jvisualvm中編寫和測試BTrace腳本,啟動、關閉、發送事件、增加classpath都非常方便。


btrace實例

package baby.btrace;public class CaseObject{private static int sleepTotalTime=0; private int sleepTotalTime2=0; public boolean execute(int sleepTime) throws Exception{System.out.println("sleep: "+sleepTime);sleepTotalTime+=sleepTime;sleepTotalTime2=sleepTotalTime+1;sleep(sleepTime);if(sleepTime%2==0)return true;else return false;}public void sleep(int sleepTime) throws Exception { Thread.sleep(sleepTime); }}


?

package baby.btrace;import java.util.Random;public class CaseObjectMain {int times = 10;public static void main(String[] args) {CaseObjectMain main= new CaseObjectMain();try {main.begin();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}public void begin() throws Exception{CaseObject object=new CaseObject();while(true){times++;boolean result=doWork(object);Thread.sleep(1000);}}public boolean doWork(CaseObject object) throws Exception{Random random=new Random();boolean temp= object.execute(random.nextInt(1000));return temp;}}


1、獲取返回值,參數等信息

/* BTrace Script Template */ import com.sun.btrace.annotations.*; import static com.sun.btrace.BTraceUtils.*;@BTrace public class TracingScript {/* put your code here */ /*指明要查看的方法,類*/@OnMethod(clazz="baby.btrace.CaseObject",method="execute",location=@Location(Kind.RETURN)) /*主要兩個參數是對象自己的引用 和 返回值,其它參數都是方法調用時傳入的參數*/public static void traceExecute(@Self baby.btrace.CaseObject object,int sleepTime, @Return boolean result){println("調用堆棧!!");println(strcat("返回結果是:",str(result)));jstack();println(strcat("時間是:",str(sleepTime)));}}


2、獲取對象屬性值

/* BTrace Script Template */ import com.sun.btrace.annotations.*; import static com.sun.btrace.BTraceUtils.*;@BTrace public class TracingScript {/* put your code here */ /*指明要查看的方法,類*/@OnMethod(clazz="baby.btrace.CaseObject",method="execute",location=@Location(Kind.RETURN)) /*主要兩個參數是對象自己的引用 和 返回值,其它參數都是方法調用時傳入的參數*/public static void traceExecute(@Self baby.btrace.CaseObject object,int sleepTime, @Return boolean result){println("調用堆棧!!");println(strcat("返回結果是:",str(result)));jstack();println(strcat("時間是:",str(sleepTime)));}}


3、獲取方法執行時長

import com.sun.btrace.annotations.*; import static com.sun.btrace.BTraceUtils.*;@BTrace public class TracingScript3 {@TLS private static long startTime = 0;@OnMethod(clazz="baby.btrace.CaseObject",method="execute") public static void startExecute(){startTime = timeNanos();} @OnMethod(clazz="baby.btrace.CaseObject",method="execute",location=@Location(Kind.RETURN)) public static void endExecute(@Duration long duration){long time = timeNanos() - startTime;println(strcat("execute time(nanos): ", str(time)));println(strcat("duration(nanos): ", str(duration)));} }


4、正則匹配和獲取方法執行次數

import com.sun.btrace.annotations.*; import static com.sun.btrace.BTraceUtils.*;@BTrace public class TracingScript4 {private static long count; @OnMethod(clazz="/.*/",method="execute",location=@Location(value=Kind.CALL, clazz="/.*/", method="sleep"))public static void traceExecute(@ProbeClassName String pcm, @ProbeMethodName String pmn,@TargetInstance Object instance, @TargetMethodOrField String method){println("====== ");println(strcat("ProbeClassName: ",pcm));println(strcat("ProbeMethodName: ",pmn));println(strcat("TargetInstance: ",str(classOf(instance))));println(strcat("TargetMethodOrField : ",str(method)));count++;}@OnEventpublic static void getCount(){println(strcat("count: ", str(count)));} }


5、正則和事件交互

import com.sun.btrace.annotations.*; import static com.sun.btrace.BTraceUtils.*;@BTrace public class TracingScript5 {private static long count; @OnMethod(clazz="/.*/",method="execute",location=@Location(value=Kind.CALL, clazz="/.*/", method="sleep"))public static void traceExecute(@ProbeClassName String pcm, @ProbeMethodName String pmn,@TargetInstance Object instance, @TargetMethodOrField String method){println("====== ");println(strcat("ProbeClassName: ",pcm));println(strcat("ProbeMethodName: ",pmn));println(strcat("TargetInstance: ",str(classOf(instance))));println(strcat("TargetMethodOrField : ",str(method)));count++;}@OnEventpublic static void getCount(){println(strcat("count: ", str(count)));}@OnEvent("A")public static void getCountA(){println("==AAAA==== ");println(strcat("count: ", str(count)));}@OnEvent("B")public static void getCountB(){println("==BBB==== ");println(strcat("count: ", str(count)));} }


?

鏈接:

http://agapple.iteye.com/blog/1005918

http://agapple.iteye.com/blog/962119

轉載于:https://my.oschina.net/xiaominmin/blog/1599642

總結

以上是生活随笔為你收集整理的利用btrace在线监控java程序状态的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。