引言:Btrace是一个非常奇特的工具,非侵入式的工具,可以监控程序中发生的运行状态,本文将介绍如何使用Btrace来完成监控工具。
1. Btrace
BTrace 是一个可靠的,用来动态跟踪Java程序的工具。它通过动态对运行中的Java程序进行字节码生成来工作。BTrace会对运行中的Java程序的类插入一些跟踪操作 来对被跟踪的程序进行热替换。
BTrace应用较为广泛的原因应该是其安全性和无侵入性,已经热交互技术,使得我们无需启动Agent的情况下动态跟踪分析,其安全性不会导致对目标Java进程的任何破坏性影响,使得BTrace成为我们线上产品问题定位的利器。无侵入性无需我们对原有代码做任何修改,降低上线风险和测试成本,并且无需重启启动目标Java进程进行Agent加载即可动态分析和跟踪目标程序,可以说BTrace可以满足大部分的应用场景。
项目主页: https://kenai.com/projects/btrace
2. Btrace示例
Btrace的监控代码如下:
import static com.sun.btrace.BTraceUtils.str;
import static com.sun.btrace.BTraceUtils.strcat;
import static com.sun.btrace.BTraceUtils.print;
import static com.sun.btrace.BTraceUtils.println;
import static com.sun.btrace.BTraceUtils.timeMillis;
import com.sun.btrace.AnyType;
import com.sun.btrace.BTraceUtils.Time;
import com.sun.btrace.annotations.BTrace;
import com.sun.btrace.annotations.Kind;
import com.sun.btrace.annotations.Location;
import com.sun.btrace.annotations.OnMethod;
import com.sun.btrace.annotations.ProbeClassName;
import com.sun.btrace.annotations.ProbeMethodName;
import com.sun.btrace.annotations.TLS;
@BTrace
public class BTraceMethod {
@TLS
private static long startTime;
@OnMethod(clazz="/com.rain.wx.meal.*/", method="/.*/", location=@Location(Kind.ENTRY))
public static void startMethod() {
startTime = timeMillis();
}
@OnMethod(clazz="/com.rain.wx.meal.*/", method="/.*/", location=@Location(Kind.RETURN))
public static void endMethod(@ProbeClassName String clazz,@ProbeMethodName String method) {
print(strcat(strcat(clazz ,"."), method));
print("[");
print(strcat("Time takes ", str(timeMillis() - startTime)));
println("]");
}
}
这里做个说明,Btrace里面的类库都是内置的,无法使用jdk中自带的类库和工具类,这个需要格外注意,遵守java的语法,但是只能使用Btrace自带的类库和工具类。
从这里的代码中,我们可以发现其中是基于模式来进行匹配的,匹配class和类中的方法,在这个方法体中,打印出各个方法输出的执行时间差。
我们进入JDK目录,然后点击jvisualvm,在plugins中安装btrace插件,在安装完成之后,启动调试工具:
点击运行程序,然后监控运行信息输出:
3. Btrace内容的详述
关于Btrace的内容,在下面这篇文章已经有了很详细的介绍,这里就不在赘述了。
Btrace基本资料的参考资料: http://blog.csdn.net/mgoann/article/details/7268508
另外大家也可以参考官网的参考资料。
4. 参考资料
- http://www.cnblogs.com/serendipity/archive/2012/05/14/2499840.html
- http://linmingren2003.blog.163.com/blog/static/56751003201121871725139/
- http://blog.csdn.net/mgoann/article/details/7268657