Btrace使用说明

引言: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
1.btrace扩展是在btrace已由功能上进行的扩展,原有功能和使用方式依然没变。目前版本扩展了两个功能:接口时间监控和接口时间调用树监控。扩展之后的btrace功能使用时都不需要写btrace脚本。 2.使用接口时间监控功能,命令格式为btrace -E mCall pid clazz method,其中clazz 为需要监控的方法所在的类,method为需要监控的方法名称。例如btrace -E mCall 5100 cn.com.icegarden.test.BtraceMain spendTime 3.使用接口时间调用树功能,命令为btrace -E mCallTree clazz method innerClazzes innerMethods 其中clazz为要监控的入口方法所在的类,method为要监控的入口方法名称。 innerClazzes和innerMethods为要监控的入口方法内部调用的方法和所在的类。举例来讲:cn.icegarden.com.A类的a方法中调用了cn.icegarden.com.B类的b方法、cn.icegarden.com.C类的c方法。cn.icegarden.com.C类的c方 法中又调用了cn.icegarden.com.D的d方法。如果要监控A类的a方法在调用这些方法上的时间,使用btrace扩展的调用树功能可以使用命令: btrace -E mCallTree 4432 cn.icegarden.com.A a cn.icegarden.com.B,cn.icegarden.com.C,cn.icegarden.com.D b,c,d 输出结果如下: 0 [9,999ms (1,000ms), 100%] - a +---0 [1,999ms, 20%, 20%] - b `---1,999 [7,000ms (3,000ms), 70%, 70%] - c `---1,999 [4,000ms, 57%, 40%] - d 每一个节点都会输出如下格式的内容: a [b ms,c%,d%] - e 其中a 是打点开始到当前节点开始执行期间的时间间隔毫秒值。 b 是当前节点的方法总共执行的时间。 c 是当前节点执行时间占上一个节点总执行时间的百分比。 d 是当前节点执行时间占入口节点总执行时间的百分比。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值