如何使用 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 的使用教程。
深入摸索的话,还是可以轻松的自定义一些监控插件。
原计划是强迫自己每周二写一篇技术文章,现因为工作日的不可控因素比较多,改为强迫自己每周日写一篇。
感谢各位小伙伴的阅读,这里是一个技术人的学习与分享。
- PhalApi-APK--APK文件解包处理
- [喵咪PHP]页面显示空白问题
- 数据库中间件 Sharding-JDBC 源码分析 —— 结果归并
- PhalGo-Request
- PhalApi-Excel
- PhalGo-Viper获取配置
- Dubbo 源码解析 —— 集群容错架构设计
- PhalGo-ADM思想
- 数据库中间件 Sharding-JDBC 源码分析 —— JDBC实现与读写分离
- Pytorch 0.3.0 发布:新增张量函数,支持模型移植
- 数据库分库分表中间件 Sharding-JDBC 源码分析 —— SQL 执行
- PhalGo-初识PhalGO
- 【学术】如何在神经网络中选择正确的激活函数
- PhalGo-Echo路由
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Stata中的治疗效果:RA:回归调整、 IPW:逆概率加权、 IPWRA、 AIPW
- R语言在不同样本量下的Littles MCAR检验
- PHP10段常用功能代码
- MySQL中group_concat()函数用法总结
- [::-1] 数组中元素反向
- MySQL面试题
- numpy~运算符和Boolean类型变量
- PHP安全基础第一章
- 21 个非常有用的 .htaccess 提示和技巧
- PHP实现图片马赛克效果
- PHP中的类
- PHP获取表单textarea数据中的换行问题
- Numpy根据Bool值挑选数组中元素
- MySQL获取每个分类下面的前三条数据
- windows宿主机如何SSH连接VMware的Linux虚拟机