BTrace是一个开源项目,开始于2007年,名声鹊起得益于2008年的JavaOne会议。
BTrace有助于我们解决针对复杂的代码追查问题,包括代码错误的,不可预测的流量,并发性问题和性能问题,通常都是很难重现的情况下发生的。
BTrace动态(无需重新启动应用程序)改变应用程序的字节码。测量的目标可以在一个特定的代码区域。如果超出此范围使用,可能会损害应用程序的流量,因此是禁止通过验证。
例如,让我们尝试解决以下问题 - 每天一次偶尔的重要文件被删除。我们希望找到是哪行代码干这个坏事。因此,我们想修改'删除'方法的java.io.File代码,加入打印调用线程的堆栈跟踪。 BTrace可以帮助我们做到这一点,通过写一个短和直接的Java代码:
import com.sun.btrace.annotations.*; import com.sun.btrace.BTraceUtils;
@BTrace public class HelloWorld {
@OnMethod(clazz="java.io.File",method="") public static void onNewFileCreated(String fileName) { BTraceUtils.println("New file is being created"); BTraceUtils.println(fileName); }
Btrace代码非常有AOP面向方面编程特点。每个BTrace脚本由探头Probes (切入点方面pointcuts)和Actions操作(advice)组成。探针Probe可以在以下地方:
Btrace原理如下:
在目标JVM是一个动态插入BTrace的代理。 BTrace客户端(无论是BTrace命令行或Visual VM的 BTrace插件)将命令发送到代理,并得到响应。 BTrace代理测量类被加载到目标JVM并重新加载已加载的类。