参考: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等。