版权声明:本文为个人学习总结,欢迎转载,转载时请附加原文链接 https://blog.csdn.net/cockroach02/article/details/87743017
1. BTrace简介
BTrace(https://github.com/btraceio/btrace)是sun公司推出的一款Java 动态、安全追踪(监控)工具,可以在不用重启的情况下监控系统运行情况,方便的获取程序运行时的数据信息,如方法参数、返回值、全局变量和堆栈信息等,并且做到最少的侵入,占用最少的系统资源。
1.1 应用场景
- 服务慢,能找出慢在哪一步,哪个函数里么?
- 谁调用了System.gc(),调用栈如何?
- 谁构造了一个超大的ArrayList?
- 什么样的入参或对象属性,导致抛出了这个异常?或进入了这个处理分支?
1.2 使用限制
1、不能创建对象
2、不能使用数组
3、不能抛出或捕获异常
4、不能使用循环
5、不能使用synchronized关键字
6、属性和方法必须使用static修饰
1.3 相关链接(讲解的非常详细)
1、BTrace用户手册<译>
2、Btrace入门到熟练小工完全指南
2. Visualvm安装BTrace插件
这步操作理论上是非常简单的,但是我在本地安装的jdk1.8.0_111折腾了很久,问题都是选中一个虚拟机就是不显示“trace application”,如下图:
我的解决办法是进入Visualvm官网(https://visualvm.github.io/)下载最新的Visualvm包,解压安装插件(BTrace Workbench)就好了,安装成功截图如下
3. BTrace使用几个例子
3.1 打印方法调用参数列表
import java.util.Map;
import com.sun.btrace.AnyType;
import com.sun.btrace.BTraceUtils;
import com.sun.btrace.annotations.BTrace;
import com.sun.btrace.annotations.OnMethod;
import com.sun.btrace.annotations.OnTimer;
@BTrace
public class TracingScript {
@OnTimer(10)
@OnMethod(clazz = "com.seeyon.ctp.util.DBAgent", method = "find")
public static void onDBAgentFind(String hql, Map<String, Object> params, AnyType fi) {
BTraceUtils.println("=====================");
BTraceUtils.println("hql:" + hql);
BTraceUtils.println("params:" + params);
BTraceUtils.println("fi:" + fi);
}
}
3.2 统计方法执行时长
import java.util.Map;
import com.sun.btrace.AnyType;
import com.sun.btrace.BTraceUtils;
import com.sun.btrace.annotations.BTrace;
import com.sun.btrace.annotations.Duration;
import com.sun.btrace.annotations.Kind;
import com.sun.btrace.annotations.Location;
import com.sun.btrace.annotations.OnMethod;
import com.sun.btrace.annotations.Return;
@BTrace
public class TracingScript {
@OnMethod(clazz = "com.seeyon.ctp.util.DBAgent", method = "find", location = @Location(value = Kind.RETURN))
public static void onDBAgentFind(String hql, Map<String, Object> params, AnyType fi, @Return AnyType rt, @Duration long duration) {
BTraceUtils.println("=====================");
BTraceUtils.println("hql:" + hql);
BTraceUtils.println("params:" + params);
BTraceUtils.println("returnValue:" + rt);
BTraceUtils.println("duration:" + duration);
}
}
3.3 匹配所有的Connection类,在接口或基类的名称前面,加个+ 就行
import com.sun.btrace.BTraceUtils;
import com.sun.btrace.annotations.BTrace;
import com.sun.btrace.annotations.OnMethod;
@BTrace
public class TracingScript {
@OnMethod(clazz="+java.sql.Connection", method="setAutoCommit")
public static void onConnectionSetAutoCommit(boolean autoCommit){
BTraceUtils.println("connection.setAutoCommit:" + autoCommit);
BTraceUtils.jstack();
}
}
4. 总结
- Visualvm JMX方式连接远程主机的时候不能使用BTrace Workbetch,折腾了好久也没搞定,只能下次继续了.
- 下次试试阿里的arthas感受下两种的区别,到时候再做总结分享.
5. 参考链接
- 如何在生产环境使用Btrace进行调试
- Btrace入门到熟练小工完全指南
- BTrace用户手册<译>(内含参数API说明和例子)
- Trace使用总结