Java BTrace的运用ITeye - 乐橙lc8

Java BTrace的运用ITeye

2019年02月25日12时12分20秒 | 作者: 翠安 | 标签: 运用,办法,比方 | 浏览: 655

 BTrace 是一个十分不错的java确诊东西, 最近试着用了一下, 文档比较少, 首要是看比方吧.  
BTrace 中的B标明bytecode, 标明它是在字节码层面上对代码进行trace 
用来在运转中的java类中注入trace代码, 并对运转中的方针程序进行热交换(hotswap) 

btrace还供给了VisualVM Plugin 以及Netbeans Plugin

术语 
Probe Point 
在何处履行trace句子, 这儿的"何处"可所以详细的盯梢地址和履行事情, 在BTrace中经过各种注解来指定 

Trace Actions or Actions 
在何时履行trace句子 

Action Methods 
界说在trace脚本中的trace句子, 详细来说就是脚本中的无返回值静态办法(1.2之后可所以非静态办法) 

BTrace约束 
为了确保trace句子只读, BTrace对trace脚本有一些约束(比方不能改动被trace代码中的状况) 

·         BTrace class不能新建类, 新建数组, 抛反常, 捕获反常,

·         不能调用实例办法以及静态办法(com.sun.btrace.BTraceUtils在外)

·         不能将方针程序和方针赋值给BTrace的实例和静态field

·         不能界说外部, 内部, 匿名, 本地类

·         不能有同步块和办法

·         不能有循环

·         不能完成接口, 不能扩展类

·         不能运用assert句子, 不能运用class字面值

 

BTrace过程 
1.获得方针java进程id(pid) 
2.编写BTrace脚本 
3.履行指令行:  btrace pid 自己定制的脚本 输出文件

eg:btrace 3045PrintExecuteTime.java time.log 

完好的BTrace指令: 

btrace [-I include-path ] [-p port ] [-cp classpath ] pid btrace-script [ args ]

 

-I 没有这个标明越过预编译 include-path: 指定用来编译脚本的头文件途径(关于预编译可参阅比方ThreadBean.java) port : btrace agent端口, 默许是2020 classpath : 编译所需类途径, 一般是指btrace-client.jar等类地点途径 pid : java进程id btrace-script: btrace脚本, 假如是java文件, 则是未编译, class文件, 则是已编译过的 args: 传递给btrace脚本的参数, 在脚本中能够经过$(), $length()来获取这些参数(界说在BTraceUtils中)

预编译BTrace脚本指令 

btracec [-I include-path ] [-cp classpath ] [-d directory ] one-or-more-BTrace-.java-files


参数和上面迥然不同, btracec 是一个相似javac的程序, 运用该程序编译, 将依据BTrace的约束条件进行严厉检查 

在方针程序中发动BTrace Agent 
这个首要针对需要在方针程序发动的时分就需要trace其行为的场景, 此刻BTrace agent将与方针程序一同发动(条件是有必要对BTrace脚本进行预编译) 
指令行: 

java -javaagent:btrace-agent.jar=script= pre-compiled-btrace-script1 [, pre-compiled-btrace-script1 ]* MainClass AppArguments

办法上的注解 

@com.sun.btrace.annotations.OnMethod  用来指定trace的方针类和办法以及详细方位, 被注解的办法在匹配的办法履行到指定的方位会被调用. "clazz"特点用来指定方针类名, 能够指定全限制类名, 比方"java.awt.Component", 也可所以正则表达式(表达式有必要写在"//"中, 比方"/java\\.awt\\..+/").  "method"特点用来指定被trace的办法. 表达式能够参阅自带的比方(NewComponent.java 和 Classload.java, 关于办法的注解能够参阅MultiClass.java). 有时分被trace的类和办法或许也运用了注解. 用法参阅自带比方WebServiceTracker.java. 针对注解也是能够运用正则表达式, 比方像这个"@/com\\.acme\\..+/ ", 也能够经过指定超类来匹配多个类, 比方"+java.lang.Runnable"能够匹配一切完成了java.lang.Runnable接口的类. 详细参阅自带比方SubtypeTracer.java. @com.sun.btrace.annotations.OnTimer 用来指定时长(ms)履行一次trace. 时长经过"value"特点指定. 详细参阅自带比方 Histogram.java @com.sun.btrace.annotations.OnError 当trace代码抛反常时该注解的办法会被履行. 假如同一个trace脚本中其他办法抛反常, 该注解办法也会被履行. @com.sun.btrace.annotations.OnExit 当trace办法调用内置exit(int)办法(用来完毕整个trace程序)时, 该注解的办法会被履行. 参阅自带比方ProbeExit.java. @com.sun.btrace.annotations.OnEvent 用来截获"外部"btrace client触发的事情, 比方按Ctrl-C 中止btrace履行时将履行运用了该注解的办法, 该注解的value值为详细事情称号. 详细参阅比方HistoOnEvent.java @com.sun.btrace.annotations.OnLowMemory 当内存超越某个设定值将触发该注解的办法, 详细参阅MemAlerter.java @com.sun.btrace.annotations.OnProbe //我也没搞理解:(

参数上的注解 

@com.sun.btrace.annotations.Self 用来指定被trace办法的this, 可参阅比方AWTEventTracer.java 和 AllCalls1.java @com.sun.btrace.annotations.Return 用来指定被trace办法的返回值, 可参阅比方Classload.java @com.sun.btrace.annotations.ProbeClassName (since 1.1) 用来指定被trace的类名, 可参阅比方AllMethods.java @com.sun.btrace.annotations.ProbeMethodName (since 1.1) 用来指定被trace的办法名, 可参阅比方WebServiceTracker.java           o (since 1.2)能够经过注解的fqn boolean特点来标明是否要获取全限制办法名 

 

@com.sun.btrace.annotations.TargetInstance (since 1.1) 用来指定被trace办法内部被调用到的实例, 可参阅比方AllCalls2.java @com.sun.btrace.annotations.TargetMethodOrField (since 1.1) 用来指定被trace办法内部被调用的办法名, 可参阅比方AllCalls1.java 合 AllCalls2.java           o (since 1.2) 可经过注解的fqn boolean特点来标明是否要获取全限制办法名 

未被注解的办法参数 
未运用注解的办法参数一般都是用来做办法签名匹配用的, 他们一般和被trace办法中参数呈现的次序共同. 不过他们也能够与注解办法交织运用, 假如一个参数类型声明为*AnyType[]*, 则标明它按次序"通吃"办法一切参数. 未注解办法需要与*Location*结合运用: 

Kind.ENTRY, Kind.RETURN- 被trace办法参数 Kind.THROW - 抛反常 Kind.ARRAY_SET, Kind.ARRAY_GET - 数组索引 Kind.CATCH - 捕获反常 Kind.FIELD_SET - 特点值 Kind.LINE - 行号 Kind.NEW - 类名 Kind.ERROR - 抛反常

特点上的注解 

@com.sun.btrace.annotations.Export 该注解的静态特点首要用来与jvmstat计数器做相关. 运用该注解之后, btrace程序就能够向jvmstat客户端(能够用来计算jvm堆中的内存运用量)露出trace程序的履行次数, 详细可参阅比方ThreadCounter.java @com.sun.btrace.annotations.Property 运用了该注解的trace脚本将作为MBean的一个特点, 一旦运用该注解, trace脚本就会创立一个MBean并向MBean服务器注册, 这样JMX客户端比方VisualVM, jconsole就能够看到这些BTrace MBean. 假如这些被注解的特点与被trace程序的特点相关, 那么就能够经过VisualVM 和jconsole来检查这些特点了. 详细可参阅比方ThreadCounterBean.java 和 HistogramBean.java. @com.sun.btrace.annotations.TLS 用来将一个脚本变量与一个ThreadLocal变量相关. 由于ThreadLocal变量是跟线程相关的, 一般用来检查在同一个线程调用中是否履行到了被trace的办法. 详细可参阅比方OnThrow.java 和 WebServiceTracker.java

类上的注解 

@com.sun.btrace.annotations.DTrace 用来指定btrace脚本与内置在其脚本中的D言语脚本相关, 详细参阅比方DTraceInline.java. @com.sun.btrace.annotations.DTraceRef 用来指定btrace脚本与另一个D言语脚本文件相关. 详细参阅比方DTraceRefDemo.java. @com.sun.btrace.annotations.BTrace 用来指定该java类为一个btrace脚本文件.



监控办法参数(数组)

 1     import static com.sun.btrace.BTraceUtils.print;    
 2     import static com.sun.btrace.BTraceUtils.printArray;    
 3     import static com.sun.btrace.BTraceUtils.println;    
 4     import static com.sun.btrace.BTraceUtils.probeClass;    
 5     import static com.sun.btrace.BTraceUtils.probeMethod;    
 6        
 7     import com.sun.btrace.annotations.BTrace;    
 8     import com.sun.btrace.annotations.OnMethod;    
 9        
10     @BTrace   
11     public class PrintArgArray {    
12        
13         /** 
14           * 此办法打印出Test类中的mergeArray(Long[] arrayOne, Long[] arrayTwo)办法传入的参数 
15           * 参数姓名必定要和监控方针的办法参数姓名共同 
16           * 
17           * @param arrayOne 监控参数一 
18           * @param arrayTwo 监控参数二 
19           * 
20           */   
21         @OnMethod(clazz = "com.jerry.test.Test", method = "mergeArray")    
22         // 此处写明要监控的包、类、办法等   能够运用正则匹配    
23         public static void anyRead(Long[] arrayOne, Long[] arrayTwo) {    
24             // 打印监控的类名    
25              print(probeClass());    
26              print("   [");    
27             // 打印监控的办法名    
28              print(probeMethod());    
29              println("]");    
30        
31             if (arrayOne != null) {    
32                  printArray(arrayOne);    
33              } else {    
34                  println("the arguments is null!");    
35              }    
36        
37             if (arrayTwo != null) {    
38                  printArray(arrayTwo);    
39              } else {    
40                  println("the arguments is null!");    
41              }    
42          }    
43        
44     }   


监控运用时刻

 1     import static com.sun.btrace.BTraceUtils.name;    
 2     import static com.sun.btrace.BTraceUtils.print;    
 3     import static com.sun.btrace.BTraceUtils.println;    
 4     import static com.sun.btrace.BTraceUtils.probeClass;    
 5     import static com.sun.btrace.BTraceUtils.probeMethod;    
 6     import static com.sun.btrace.BTraceUtils.str;    
 7     import static com.sun.btrace.BTraceUtils.strcat;    
 8     import static com.sun.btrace.BTraceUtils.timeMillis;    
 9        
10     import com.sun.btrace.annotations.BTrace;    
11     import com.sun.btrace.annotations.Kind;    
12     import com.sun.btrace.annotations.Location;    
13     import com.sun.btrace.annotations.OnMethod;    
14     import com.sun.btrace.annotations.TLS;    
15        
16     /** 
17     * 监控办法耗时 
18     * 
19     * 
20     */   
21     @BTrace   
22     public class PrintTimes {    
23        
24         /** 
25           * 开端时刻 
26           */   
27         @TLS   
28         private static long startTime = 0;    
29        
30         /** 
31           * 办法开端时调用 
32           */   
33         @OnMethod(clazz = "/com\\copul\\../", method = "/.+/")    
34         public static void startMethod() {    
35              startTime = timeMillis();    
36          }    
37        
38         /** 
39           * 办法完毕时调用 br  
40           * Kind.RETURN这个注解很重要 
41           */   
42         @SuppressWarnings("deprecation")    
43         @OnMethod(clazz = "/com\\.copul\\../", method = "/.+/", location = @Location(Kind.RETURN))    
44         public static void endMethod() {    
45        
46              print(strcat(strcat(name(probeClass()), "."), probeMethod()));    
47              print("   [");    
48              print(strcat("Time taken : ", str(timeMillis() - startTime)));    
49              println("]");    
50          }    
51     }   


监控内存

 1     import static com.sun.btrace.BTraceUtils.*;    
 2     import java.lang.management.MemoryUsage;    
 3        
 4     import com.sun.btrace.annotations.BTrace;    
 5     import com.sun.btrace.annotations.OnLowMemory;    
 6        
 7     /** 
 8     * 监控内存运用 
 9     * 
10     * 
11     */   
12     @BTrace   
13     public class PrintMemory {    
14        
15         /* 
16           * 指定内存区域低于必定的边界的时分才内存运用打印数据 br  也能够指定时刻距离打印内存运用 
17           */   
18         @OnLowMemory(pool = "Tenured Gen", threshold = 6000000)    
19         public static void printMem(MemoryUsage mu) {    
20              print("MemoryUsage : ");    
21              println(mu);    
22              print("FreeMem : ");    
23              println(freeMemory());    
24              print("Heap:");    
25              println(heapUsage());    
26              print("Non-Heap:");    
27              println(nonHeapUsage());    
28          }    
29     }
版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表乐橙lc8立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章