Skip to content

BTrace监控调优

是什么

BTrace 是一个Java动态跟踪工具,它允许开发者在不重启目标Java应用的情况下,在运行时安全地注入诊断或监控代码。BTrace通过利用Java的Attach API和字节码操作技术来实现对应用程序的实时监控,可以帮助开发人员快速定位问题、分析性能瓶颈,并收集程序运行时数据。

关键特点:

  1. 无侵入性: Btrace脚本可以在目标Java进程上运行,而无需修改应用程序源代码或重新编译部署。

  2. 方法执行时间监控: 可以编写脚本来追踪特定方法的执行时间,这对于识别慢速执行的方法非常有用。

  3. 变量监控与状态捕获: 能够监控特定类或对象的状态,如字段值的变化,以及在方法调用时参数和返回值的情况。

  4. 事件触发式探查: 当满足特定条件时(例如:特定方法被调用、特定异常抛出),可以触发脚本中的动作。

  5. 正则表达式匹配: 通过正则表达式匹配字符串内容,可以用于日志分析或其他基于字符串条件的监控。

  6. 可视化工具集成: Btrace可以与JDK自带的JVisualVM工具集成,使得监控结果可以通过图形化界面查看。

  7. 脚本编写: 使用标准Java语法编写Btrace脚本,脚本中包含特定的注解来指定要监控的类和方法。

  8. 实时分析: Btrace脚本一旦加载到目标进程中,会立即开始工作并输出结果,帮助实时调试和优化。

  9. 安全性: Btrace设计时考虑了安全性,确保注入的脚本不会影响到应用的稳定性和完整性。

为了使用Btrace,首先需要将Btrace插件安装到JVisualVM中,然后编写相应的Btrace脚本文件,并将其加载到想要监控的Java进程中。这样就可以根据脚本定义的逻辑获取应用程序内部的各种信息,进而进行性能分析和故障排查。

安装

github

安装包下载

配置环境变量

新增环境变量

BTRACE_HOME=D:\JavaStack\btrace-v2.2.4-bin

添加Path

%BTRACE_HOME%\bin

目录结构

shell
D:\JAVASTACK\BTRACE-V2.2.4-BIN
├─bin
├─libs
  └─amd64
└─samples

bin目录

bin
│      btrace
│      btrace.bat
│      btracec
│      btracec.bat
│      btracep
│      btracep.bat
│      btracer
│      btracer.bat

libs目录

libs
│  │  btrace-agent.jar
│  │  btrace-boot.jar
│  │  btrace-client.jar
│  │
│  └─amd64
│          libbtrace.so

samples目录

samples
AllCalls1.java
AllCalls1Sampled.java
AllCalls2.java
AllCalls2Sampled.java
AllCalls3.java
AllCalls3Sampled.java
AllLines.java
AllMethods.java
AllMethods1.java
AllMethodsLevels.java
AllMethodsSampled.java
AllSync.java
ArgArray.java
AWTEventTracer.java
btracedefs.h
classload.d
Classload.java
CommandArg.java
Deadlock.java
DTraceInline.java
DTraceRefDemo.java
FileTracker.java
FileTrackerJfr.java
FinalizeTracker.java
Histogram.java
HistogramBean.java
HistoOnEvent.java
java.net.socket.xml
JdbcQueries.java
JInfo.java
JMap.java
JStack.java
jthread.d
jurls.d
LogTracer.java
MemAlerter.java
Memory.java
MultiClass.java
NewArray.java
NewComponent.java
OnThrow.java
ProbeArgs.java
ProbeExit.java
Profiling.java
Sizeof.java
SocketTracker.java
SocketTracker1.java
SubtypeTracer.java
syscalls.d
SysProp.java
Test.java
ThreadBean.java
ThreadCounter.java
ThreadCounterBean.java
ThreadStart.java
Timers.java
URLTracker.java
WebServiceTracker.java

查看文件列表 tree . /F

运行脚本的方式

1、在JVisualVM中添加Btrace插件,添加classpath

2、使用命令行

shell
btrace pid trace_script

JVisualVM安装Btrace插件

可参考

BTrace脚本的编写基于Java语法,通过在类中使用特定的注解来指示哪些代码片段应该注入到目标Java应用进行监控。

java
import com.sun.btrace.annotations.*;

@BTrace
public class MyBTraceScript {
    @OnMethod(
        clazz = "com.example.MyClass", // 目标类的全限定名
        method = "myMethod", // 要监控的方法名
        location = @Location(Kind.ENTRY) // 在方法入口处执行
    )
    public static void onMyMethodEntry(@Self MyClass instance, int arg1) {
        // 这里的代码将在指定方法被调用时执行
        String msg = "method myMethod invoked with argument: " + arg1;
        println(msg); // BTrace提供的打印语句,输出到标准错误流
    }

    @OnTimer(name = "periodic-check", period = 5000) // 每5秒执行一次
    public static void periodicCheck() {
        // 定期执行的任务
        ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
        long[] threadIds = threadMXBean.getAllThreadIds();
        for (long id : threadIds) {
            ThreadInfo info = threadMXBean.getThreadInfo(id);
            println("Thread: " + info.getThreadName());
        }
    }
}
  • @BTrace 注解表明这个类是一个BTrace脚本。

  • @OnMethod 注解定义了一个在指定类和方法上触发的行为。这里指定了当com.example.MyClassmyMethod方法被调用时,onMyMethodEntry方法将被执行。

  • @Self 注解表示的是被监控方法所属的对象实例。

  • @Location(Kind.ENTRY) 表明在方法入口处插入代码。

  • @OnTimer 注解用于定义一个定时任务,每隔指定毫秒数(如上述例子中的5000ms即5秒)执行一次。

在实际编写BTrace脚本时,需要注意遵循BTrace的安全限制,避免对运行的应用程序产生不利影响,例如不应修改任何对象的状态或改变程序控制流程。此外,为了确保脚本能够在运行时正确编译和注入,必须遵守BTrace规定的脚本结构和使用的API范围。

编写脚本

配置依赖