【深入理解Java虚拟机】笔记4:基于Visualvm+BTrace调试分析正式环境

版权声明:本文为个人学习总结,欢迎转载,转载时请附加原文链接 https://blog.csdn.net/cockroach02/article/details/87743017

1. BTrace简介

BTrace(https://github.com/btraceio/btrace)是sun公司推出的一款Java 动态、安全追踪(监控)工具,可以在不用重启的情况下监控系统运行情况,方便的获取程序运行时的数据信息,如方法参数、返回值、全局变量和堆栈信息等,并且做到最少的侵入,占用最少的系统资源。

1.1 应用场景
  1. 服务慢,能找出慢在哪一步,哪个函数里么?
  2. 谁调用了System.gc(),调用栈如何?
  3. 谁构造了一个超大的ArrayList?
  4. 什么样的入参或对象属性,导致抛出了这个异常?或进入了这个处理分支?
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+Btrace安装不成功
我的解决办法是进入Visualvm官网(https://visualvm.github.io/)下载最新的Visualvm包,解压安装插件(BTrace Workbench)就好了,安装成功截图如下
Visualvm+Btrace安装成功

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. 总结

  1. Visualvm JMX方式连接远程主机的时候不能使用BTrace Workbetch,折腾了好久也没搞定,只能下次继续了.
  2. 下次试试阿里的arthas感受下两种的区别,到时候再做总结分享.

5. 参考链接

  1. 如何在生产环境使用Btrace进行调试
  2. Btrace入门到熟练小工完全指南
  3. BTrace用户手册<译>(内含参数API说明和例子)
  4. Trace使用总结

猜你喜欢

转载自blog.csdn.net/cockroach02/article/details/87743017