`
lzzy_alex
  • 浏览: 29986 次
社区版块
存档分类
最新评论

Btrace

 
阅读更多

简述

BtraceJava平台的动态追踪工具,可以在运行时向字节码文件注入追踪代码,无侵入性地对项目进行缺陷分析。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:头文件路径(可选)

portBtrace监听端口,缺省2020

classpath:相关类编译时路径,缺省是”.”

pid:被追踪的Java进程Id

btrace-scriptBtrace追踪脚本

 

方法级注解

@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脚本显式调用btraceexit(int)方法时,被注解方法将被执行

 

@OnEvent

用来截获""btrace client触发的事件, 比如按Ctrl-C 中断btrace执行时将执行使用了该注解的方法, 该注解的value值为具体事件名称

 

@OnLowMemory

当内存超过临界值的时候,方法将被执行

 

参数级注解

@Self

用来获得被追踪实例对象的引用,即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

  • 大小: 8.5 KB
分享到:
评论

相关推荐

    jvisualvm btrace插件离线安装

    在Java开发领域,性能优化是不可或缺的一环,而BTrace作为一个强大的动态跟踪工具,可以帮助开发者实时监控和分析应用程序的行为。本文将详细介绍如何在jVisualVM上进行BTrace插件的离线安装,以便在无法在线安装的...

    jdk1.8-Btrace.rar

    【标题】"jdk1.8-Btrace.rar"指的是一个针对Java开发的特殊工具包,它包含了一个名为Btrace的在线检测插件。这个插件专为Java开发者设计,旨在帮助他们在应用程序运行时进行问题的实时定位,而无需停止或重启服务。...

    Btrace 官方zip包

    **Btrace 深度解析:项目检测与性能监控** Btrace 是一款强大的Java应用程序诊断工具,它允许开发者在不修改或重启应用的情况下,实时监控和分析运行中的Java程序。这款工具的核心特性在于其无侵入性,对于繁忙的...

    btrace release-1.2.5.1

    【标题】"btrace release-1.2.5.1" 指的是BTrace的一个特定版本,1.2.5.1。BTrace是一款强大的Java应用动态追踪工具,它允许开发者在运行时对Java应用程序进行性能分析和诊断,而无需修改源代码或重新部署应用。这个...

    BTrace监控远程服务器使用实例

    **BTrace监控远程服务器使用实例** BTrace 是一个强大的、安全的、动态的Java应用程序诊断工具,它允许开发者在运行时对Java应用进行细粒度的监控和性能分析。BTrace利用了Java的动态代理机制(Java Agent)和ASM...

    btrace1.3.9.zip

    《深入理解BTrace 1.3.9:Java应用诊断利器》 BTrace,全称为“Bytecode Tracing”,是一款强大的动态代码插桩工具,它允许开发者在运行时对Java应用程序进行性能分析和诊断。BTrace 1.3.9是其一个重要版本,特别...

    btrace扩展功能工具

    1.btrace扩展是在btrace已由功能上进行的扩展,原有功能和使用方式依然没变。目前版本扩展了两个功能:接口时间监控和接口时间调用树监控。扩展之后的btrace功能使用时都不需要写btrace脚本。 2.使用接口时间监控...

    btrace支持jdk1.6上运行的版本

    **BTrace:深入理解与应用** BTrace 是一个强大的动态代码跟踪工具,它允许开发者在运行时对Java应用程序进行安全的、低开销的、无侵入性的性能和行为分析。这个工具的独特之处在于,它不需要修改或重新编译源代码...

    btrace-release-1.3.11.3.zip

    标题中的 "btrace-release-1.3.11.3.zip" 表明这是一个 Btrace 的特定发布版本,版本号为 1.3.11.3,通常包含已编译的库文件、文档和其他必要的资源。 在 Java 开发中,性能监控是至关重要的,因为这有助于识别和...

    BTrace自我总结测试代码

    **BTrace 自我总结测试代码** BTrace 是一个强大的、安全的、动态的Java应用程序诊断工具,由Sun Microsystems(现已被Oracle收购)开发。它允许开发者在运行时对应用程序进行探查,而无需修改源代码或重启服务。...

    btrace支持jdk1.7 linux下使用

    【标题】:“btrace支持jdk1.7 linux下使用” 【描述】:“btrace支持jdk1.7 linux下使用 非常好用哦 呵呵呵呵” 【知识点详解】 BTrace(全称:Bytecode Tracing for Java)是一款强大的动态追踪工具,专为Java...

    bTrace跟踪线程堆栈

    标题 "bTrace跟踪线程堆栈" 涉及到的是在Java开发中对线程堆栈进行监控和分析的技术,主要使用了开源工具bTrace。bTrace是一款强大的、无侵入式的Java运行时代码注入工具,允许开发者在运行中的Java应用上动态添加...

    btrace-bin-1.3.9.tgz

    **BTrace:强大的Java安全动态追踪工具** BTrace是一款高效且安全的Java动态追踪工具,其核心在于能够对正在运行的Java应用程序进行字节码级别的动态增强,无需重启或停止服务,即可实现对程序行为的实时监控和分析...

    java程序运行跟踪利器Btrace分享

    Btrace就是这样一款强大的工具,它允许开发者在不重启Java应用的情况下,动态地添加探查代码(probe),从而跟踪并理解程序的运行状态。 **Btrace简介** Btrace是由Sun Microsystems开发的一个开放源码的Java运行时...

    BTrace-一个用于Java平台的安全动态的跟踪工具

    标题中的"BTrace"是一个专为Java平台设计的安全、动态的跟踪工具,它的主要功能是对正在运行的Java应用程序进行实时监控和诊断。BTrace利用了字节码注入的技术,能够在不修改原有代码的情况下,动态地向目标应用添加...

    btrace_extend-master

    【标题】"btrace_extend-master" 是一个与BTrace工具相关的扩展项目,它提供了一些额外的功能和增强,以便更好地监控和诊断Java应用程序。BTrace是一款强大的动态代码分析工具,允许开发者在运行时对Java应用程序...

    btrace-bin.zip

    【BTrace介绍】 BTrace是一款强大的Java线上诊断和分析工具,它充分利用了Oracle HotSpot虚拟机的动态类替换功能,允许开发者在不重启应用程序的情况下,实时地添加或修改类的行为,特别是用于添加日志输出,以便于...

    btrace安装包

    BTrace是一款强大的Java诊断工具,专用于实时、安全地进行生产环境中的应用程序性能监控和故障排查。它的核心特性在于能够在不中断程序运行的情况下,动态插入代码进行跟踪和分析,这对于理解复杂的系统行为和定位...

    btrace-bin-1.3.11.tgz.tar.gz

    《深入理解BTrace:从bin包到实际应用》 BTrace,全称为“Berkeley Trace”,是一款强大的Java生产环境性能诊断工具。它以其无需修改代码、动态跟踪代码执行的能力而备受开发者青睐。本文将围绕“btrace-bin-1.3.11...

    Btrace资源

    **Btrace资源详解** Btrace 是一个强大的Java应用程序动态跟踪工具,它允许开发者在不修改代码的情况下,对正在运行的应用程序进行实时监控和诊断。这个资源包包含了Btrace的多个组件,下面我们将逐一介绍。 1. **...

Global site tag (gtag.js) - Google Analytics