简述
Btrace是Java平台的动态追踪工具,可以在运行时向字节码文件注入追踪代码,无侵入性地对项目进行缺陷分析。Btrace可以通过命令行或VisualVM插件的方式与项目集成。
Btrace可能因为以下原因而引起Jvm崩溃,所以在使用时应该谨慎行事:
1. Btrace 向JVM提交了非法的.class文件(bug in BTrace instrumentor)
2. Hotswap bug in HotSpot JVM
约束
Btrace为了确保数据安全,对追踪代码做了以下限制:
1. 不能创建新对象,新数组
2. 不能抛异常,捕获异常
3. 不能调用外部实例对象或静态方法(Btrace脚本方法除外),且在Btrace脚本中不允许创建成员属性或方法,所有可调用的Btrace方法必须是static public void类型的,所有可调用的Btrace属性也必须是static类型的。
4. 不能创建外部类,内部类,嵌套类或本地类
5. 不能有同步代码块或同步方法
6. 不能循环(while, for ..)
7. 不能实现继承与接口
8. 不能创建断言与字面量
演示
1. 新建测试类HelloThread.java,该类负责不停地启动新线程,代码如下:
public class HelloThread { public static void main(String[] args) throws InterruptedException { while (true) { new Thread().start(); Thread.sleep(1000); } } }
2. 编写Btrace追踪脚本HelloThreadTrace.java,跟踪线程启动,代码如下:
import com.sun.btrace.annotations.*; import static com.sun.btrace.BTraceUtils.*; @BTrace public class HelloThreadTrace { // 追踪Thread.start()方法的调用 @OnMethod(clazz="java.lang.Thread",method="start") public static void func() { println("about to start a thread!"); } }
3. 运行HelloThreadTrace追踪脚本,如下图就可以看到每启动一个新线程,追踪脚本都可以捕获到:
完整的btrace命令形式是这样的:
btrace [-I <include-path>] [-p <port>] [-cp <classpath>] <pid> <btrace-script> [<args>]
include-path:头文件路径(可选)
port:Btrace监听端口,缺省2020
pid:被追踪的Java进程Id
btrace-script:Btrace追踪脚本
方法级注解
@OnMethod
声明注入点,由两个属性组成:clazz,method。即当clazz.method被调用时调用,属性的定义是比较灵活的,可以使用以下方式声明:
1. 完全限定名: @OnMethod( clazz="java.lang.Thread",method="start" )
2. 正则表达式: @OnMethod( clazz="/java\\.io\\..*Input.*/",method="/read.*/" )
3. 注解: @OnMethod( clazz="@javax.jws.WebService",method="@javax.jws.WebMethod" ),即所有使用了WebService注解的方法都是注入点。
4. 注解加正则: @/com\\.acme\\..+/,匹配满足正则表达式的所有注解
5. 子类型匹配: +java.lang.Runnable
@OnTimer
周期性任务,形式如@OnTimer(4000),单位是ms,表示每4s执行一次
@OnError
当trace代码抛异常时该注解的方法会被执行. 如果同一个trace脚本中其他方法抛异常, 该注解方法也会被执行
@OnExit
当trace脚本显式调用btrace的exit(int)方法时,被注解方法将被执行
用来截获"外部"btrace client触发的事件, 比如按Ctrl-C 中断btrace执行时将执行使用了该注解的方法, 该注解的value值为具体事件名称
@OnLowMemory
当内存超过临界值的时候,方法将被执行
参数级注解
用来获得被追踪实例对象的引用,即this,如 method (@Self Object tracedObj)
@Return
用来接收被追踪程序的返回值,形式如method (@Return int retVal)
@ProbeClassName,@ProbeMethodName
用来获得当前被追踪程序的类名,方法名,在方法使用正则匹配时可能用到
@Duration
用来计算追踪点代码消耗时长,单位是纳秒,如method(@Duration long d)
未使用注解的方法参数一般都是用来做方法签名匹配用的, 他们一般和traced方法中参数出现的顺序一致. 不过他们也可以与注解方法交错使用, 如果一个参数类型声明为*AnyType[]*, 则表明它按顺序"通吃"方法所有参数. 未注解方法需要与*Location*结合使用:
Kind.ENTRY, Kind.RETURN- 被trace方法参数
Kind.THROW - 抛异常
Kind.ARRAY_SET, Kind.ARRAY_GET - 数组索引
Kind.CATCH - 捕获异常
Kind.FIELD_SET - 属性值
Kind.LINE - 行号
Kind.NEW - 类名
Kind.ERROR - 抛异常
属性级注解
@Export
该注解的静态属性主要用来与jvmstat计数器做关联. 使用该注解之后, btrace程序就可以向jvmstat客户端(可以用来统计jvm堆中的内存使用量)暴露trace程序的执行次数
@Property
使用了该注解的trace脚本将作为MBean的一个属性, 一旦使用该注解, trace脚本就会创建一个MBean并向MBean服务器注册, 这样JMX客户端比如VisualVM, jconsole就可以看到这些BTrace MBean.
@TLS
将一个脚本变量与一个ThreadLocal变量关联. 因为ThreadLocal变量是跟线程相关的, 一般用来检查在同一个线程调用中是否执行到了被trace的方法
小结
Btrace通过字节码注入,能在运行时无侵入性地分析问题,这在生产环境中非常有用,但也伴随着一定的风险。在实际应用中,常用来统计某一方法调用频率,时间消耗等。脚本书写比较简单,官方也提供常用的案例演示。
参考资料
Btrace wiki: https://kenai.com/projects/btrace/pages/Home
相关推荐
1.btrace扩展是在btrace已由功能上进行的扩展,原有功能和使用方式依然没变。目前版本扩展了两个功能:接口时间监控和接口时间调用树监控。扩展之后的btrace功能使用时都不需要写btrace脚本。 2.使用接口时间监控...
btrace btrace btrace btrace
java 在线检测插件Btrace, 无需重启服务,即可在线定位问题
btrace-bin直接解压缩配置环境变量后即可运行使用。 java监控调试工具虚拟机监控程序,利用BTrace可以在线监控java程序状态。 BTrace是一种安全,动态的Java跟踪工具。BTrace通过动态(字节码)检测正在运行的Java...
自己做的BTrace监控,Linux服务器上的tomcat工程,压缩包包含BTrace开发所需的jar包 BTrace简单示例代码 jvisualvm.exe如果远程服务器监控JVM虚拟机信息
btrace api 1.2 文档,从网上扒下来自己做的,其他地方貌似都没有chm,提供给大家使用 btrace是一个跟踪、监控java程序的小工具,能够在不改变源代码的情况下监控很多东西,比如:方法运行时间、输入输出参数、抛出...
btrace1.3.9 jdk1.8 maven 编译构建 http://github.com/btraceio/btrace
jvisualvm btrace插件离线安装,如果jvisualvm不能安装btrace,则可进行离线安装。 这里收集了安装btrace所需要的依赖包,直接添加 即可安装
jvisualvm-btrace离线安装包。 jvisualvm btrace插件离线安装包1.2.85版本,目前官网不支持国内在线下载。 含相关依赖包:jsyntaxpane-lib.nbm、net-java-btrace-api.nbm、net-java-btrace-visualvm.nbm、...
Btrace用来做项目检测,访问过的类方法统计,无侵略性,JDK1.6
Btrace Java 发布版本,Java 虚拟机监控程序
btrace支持jdk1.6上运行的版本,欢迎下载交流~
BTrace自我学习测试代码总结,包含List对象参数,自定义对象的参数的监控。
btrace支持jdk1.7 linux下使用 非常好用哦 呵呵呵呵
btrace-bin-1.3.11.zip 目前最近的版本,java调度的绝对利器
BTrace作为线上问题定位神器,它在侵入、安全、资源占用等方面表现的都非常出色。
Java的安全动态追踪工具 BTrace通过运行Java程序的动态(字节码)工具类来工作。 BTrace将追踪操作插入正在运行的Java程序的类中,并将被追踪的程序类热插拔。
btrace_extend-master,解压后上传至服务器即可以使用btrace命令
BTrace可用于动态跟踪正在运行的Java程序(类似于DTrace for OpenSolaris应用程序)。 BTrace动态地测试目标应用程序的类以注入跟踪代码(“字节代码跟踪”)。
Btrace:java性能调优及问题追踪工具 Btrace:java性能调优及问题追踪工具