如何使用 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 的使用教程。
深入摸索的话,还是可以轻松的自定义一些监控插件。
原计划是强迫自己每周二写一篇技术文章,现因为工作日的不可控因素比较多,改为强迫自己每周日写一篇。
感谢各位小伙伴的阅读,这里是一个技术人的学习与分享。
上一篇: 基于 Btrace 的监控和调试
推荐阅读
-
如何使用 @Builder 装饰器优化 HarmonyOS NEXT 中 UI 组件的重复使用?
-
如何使用 jmeter 进行 dubbo 接口测试?步骤是什么?
-
如何使用示波器测试二级点火系统 (I)
-
如何使用 FastAPI 开发无服务器应用程序?
-
香港 NEXT 如何使用 @Styles 装饰器优化组件代码?-第 1 步:定义全局 @Styles 方法
-
Humboldt NEXT 如何使用 @Styles 装饰器优化组件代码?
-
IDEA 如何使用 maven 打包(界面和命令方式)
-
如何使用 flutter doctor 命令检查环境是否配置成功
-
如何使用 Pandas 库处理大型数据集?
-
汇编语言]寄存器(CPU 如何工作)(VII) - 查看 CPU 和内存,使用机器指令和汇编指令编程 - 结论