BTrace使用

参考:http://kenwublog.com/btrace-theory-analysis

         http://blog.bluedavy.com/?p=185

         http://www.iteye.com/topic/652653

         http://macrochen.iteye.com/blog/838920

         http://kenai.com/projects/btrace/pages/UserGuide

更详细的使用参看btrace的javadoc

 

从http://kenai.com/projects/btrace/下载BTrace,并配好PATH环境变量。

定制自己需要的btrace脚本。
jps命令查出需要监控的jvm pid。

使用方法:

   btrace -cp [监控程序的class路径] [pid] [需要运行的btrace代码]

 

import com.sun.btrace.annotations.*;
import static com.sun.btrace.BTraceUtils.*;

@BTrace
public class HelloWorld {
    @OnMethod(
        clazz="java.lang.Thread",
        method="start"
    )

    public static void func() {
        println("about to start a thread!");
    }
}

 

@BTrace 说明是Btrace程序

@OnMethod告诉Btrace解析引擎需要代理的类和方法。

这个例子的作用是当java.lang.Thread类的任意一个对象调用 start 方法后,会调用 func 方法,默认是一进入start()就执行func(),可通过在OnMethod修改location属性改变方法的执行位置 ,利用这点可以计算btrace方法的计算时间。

在上面那个例子中,Java.lang.Thread 这个类的字节码被重写了。并在start方法体尾部植入了 func 方法的调用。

 

BTrace的神通仅仅局限于只读操作。不仅强制要求java脚本需要提供public static方法.而且,脚本里无法实例化对象,数组,不能抛异常或捕捉,不能有循环,内部类等等。针对一些特殊对象,BTrace也是无能为力的。比如java.lang.Integer,Array等。

你可能感兴趣的:(BTrace)