如何使用 BTrace v.2.0.1

时间:2022-07-24
本文章向大家介绍如何使用 BTrace v.2.0.1,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

前两周学习 Java Agent、Byte Buddy 的时候,发现了一个新工具 —— BTrace,一款由 sun 公司推出的适用于 Java 平台的安全、动态追踪工具。

随着 sun 公司被并入 Oracle 之后,BTrace 现状:

  • 开源代码库 https://github.com/btraceio/btrace
  • 命名规范 org.openjdk.btrace
  • JDK 支持 JDK 8, Java 9 and Java 11

虽然,BTrace 最高支持到 Java 11,跟 Oracle 最新的 Java 14 隔着三个大版本的差距。但是,好用的工具还是用多去学着用的,毕竟很多公司来停留在 Java 8 的阶(mian)段(fei)。

本文主要是在 Mac 环境下的使用教程,理论上也适用于 Linux 环境。

Windows 环境没有经过实验,所以仅提供参考。


环境准备

系统版本:macOS Catalina 10.15.4

JDK 版本:

java version "1.8.0_211"
Java(TM) SE Runtime Environment (build 1.8.0_211-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.211-b12, mixed mode)

注意:环境变量需要额外增加一行

export JAVA_8_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home

下载 BTrace bin

从 Github 下载想要的版本:https://github.com/btraceio/btrace/releases

只是使用,不考虑源码的情况下。仅需下载 bin 压缩包即可。

配置环境变量

将压缩包解压后,可以选择放在自己喜欢的目录下。

编辑 .bash_profile 文件,添加 BTRACE_HOME 环境变量。

# btrace
export BTRACE_HOME="/Users/chenxinjie/Dev/btrace-2.0.1-bin"
export PATH=$PATH:$BTRACE_HOME/bin

执行 source .bash_profile 命令,即可生效。

运行检查

$ btrace --version
BTrace v.2.0.1 (2bf6c5fbcdecda5a88f7a47a0fb7a0236b965ab2)

目标工程

准备一个简单的 Spring Boot 工程。

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>cn.live</groupId>
    <artifactId>springboot-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <artifactId>main-demo</artifactId>

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <version>2.2.7.RELEASE</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.1</version>
        <configuration>
          <encoding>UTF-8</encoding>
          <source>8</source>
          <target>8</target>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

Application.java

package cn.live;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {
  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }
}

DemoController

package cn.live.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DemoController {
  @GetMapping("/demo/zm")
  public String a() {
    return "周末刷剧啊,鑫姐!";
  }
}

浏览器打开

在 IDE 中执行 Application.java 的 main 方法,即可启动一个简单的 Java 应用程序。


BTrace 的使用

上一章节下载的 BTrace bin 包,自带了一些简单的实例

查看目标应用进程

$ jps -m -l
3664 sun.tools.jps.Jps -m -l
936
3052 cn.live.Application

Memory.java

import org.openjdk.btrace.core.annotations.BTrace;
import org.openjdk.btrace.core.annotations.OnTimer;
import static org.openjdk.btrace.core.BTraceUtils.Sys;
import static org.openjdk.btrace.core.BTraceUtils.println;

@BTrace
public class Memory {
    @OnTimer(4000)
    public static void printMem() {
        println("Heap:");
        println(Sys.Memory.heapUsage());
        println("Non-Heap:");
        println(Sys.Memory.nonHeapUsage());
    }
}

运行 Memory.java

$ btrace 3052 Memory.java
Attaching BTrace to PID: 3052
Heap:
init = 268435456(262144K) used = 34073816(33275K) committed = 317194240(309760K) max = 3817865216(3728384K)
Non-Heap:
init = 2555904(2496K) used = 42452440(41457K) committed = 52518912(51288K) max = -1(-1K)
Heap:
init = 268435456(262144K) used = 34968704(34149K) committed = 317194240(309760K) max = 3817865216(3728384K)
Non-Heap:
init = 2555904(2496K) used = 42495536(41499K) committed = 52518912(51288K) max = -1(-1K)
Heap:
init = 268435456(262144K) used = 36758480(35896K) committed = 317194240(309760K) max = 3817865216(3728384K)
Non-Heap:
init = 2555904(2496K) used = 42577744(41579K) committed = 52518912(51288K) max = -1(-1K)
Heap:
init = 268435456(262144K) used = 36758480(35896K) committed = 317194240(309760K) max = 3817865216(3728384K)
Non-Heap:
^CPlease enter your option:
  1. exit
  2. send an event
  3. send a named event
  4. flush console output
1
init = 2555904(2496K) used = 42577872(41579K) committed = 52518912(51288K) max = -1(-1K)
Heap:
init = 268435456(262144K) used = 36758480(35896K) committed = 317194240(309760K) max = 3817865216(3728384K)
Non-Heap:

可能会遇到问题

Q:Maven 无法下载 BTrace 的包。

A:手动将 BTrace bin 文件夹下的 jar 安装到本地 Maven 仓库。

$ mvn install:install-file -Dfile=/Users/chenxinjie/Dev/btrace-2.0.1-bin/libs/btrace-agent.jar -DgroupId=org.openjdk.btrace -DartifactId=btrace-agent -Dversion=2.0.1 -Dpackaging=jar
$ mvn install:install-file -Dfile=/Users/chenxinjie/Dev/btrace-2.0.1-bin/libs/btrace-client.jar -DgroupId=org.openjdk.btrace -DartifactId=btrace-client -Dversion=2.0.1 -Dpackaging=jar
$ mvn install:install-file -Dfile=/Users/chenxinjie/Dev/btrace-2.0.1-bin/libs/btrace-boot.jar -DgroupId=org.openjdk.btrace -DartifactId=btrace-boot -Dversion=2.0.1 -Dpackaging=jar

注意修改为实际的路径地址。

<dependency>
  <groupId>org.openjdk.btrace</groupId>
  <artifactId>btrace-client</artifactId>
  <version>2.0.1</version>
</dependency>
<dependency>
  <groupId>org.openjdk.btrace</groupId>
  <artifactId>btrace-boot</artifactId>
  <version>2.0.1</version>
</dependency>
<dependency>
  <groupId>org.openjdk.btrace</groupId>
  <artifactId>btrace-agent</artifactId>
  <version>2.0.1</version>
</dependency>

总结

以上是,BTrace v.2.0.1 的使用教程。

深入摸索的话,还是可以轻松的自定义一些监控插件。

原计划是强迫自己每周二写一篇技术文章,现因为工作日的不可控因素比较多,改为强迫自己每周日写一篇。

感谢各位小伙伴的阅读,这里是一个技术人的学习与分享。