JVM系列十(虚拟机性能监控神器 - BTrace).
BTrace 是什么?
BTrace 是一个动态安全的 Java 追踪工具,它通过向运行中的 Java 程序植入字节码文件,来对运行中的 Java 程序热更新,方便的获取程序运行时的数据信息,并且,保证自己的消耗特别小,大部分情况下不会影响 Java 程序的性能。
BTrace 能干什么?
相信每一位开发都或多或少的干过这档子事:为了解决线上的一个 bug,不得不在代码中打印下入参、出参数据,然后再重启服务器,观察日志。BTrace 的出现就是为了解决这类事宜,BTrace 的最大好处,是可以通过自己编写的脚本,获取应用的一切调用信息,而不需要不断的修改代码,然后重启应用。
以下是 BTrace 的一些典型应用场景:
- 服务慢,能找出慢在哪一步,哪个函数里么?
- 谁调用了System.gc(),调用栈如何?
- 谁构造了一个超大的 ArrayList?
- 什么样的入参或对象属性,导致抛出了这个异常?或进入了这个处理分支?
BTrace 快速开始
下载最新的 BTrace releases 版本:https://github.com/btraceio/btrace/releases
解压文件夹,在 <BTRACE_HOME>/bin 目录下主要有两个命令:一个是 btrace,一个是 btracec。
btrace
BTRACE_HOME/bin/btrace PID <trace_script>
btrace 将通过 JVM Attach API 连接到 的 java 应用程序,然后把脚本绑定到应用进程,进行 AOP 式的代码植入。
btracec
BTRACE_HOME/bin/btracec <trace_script>
类似于 javac,btracec 命令是用来预编译脚本的,以此校验脚本语法的正确性,要不然等运行到线上才发现写错就尴尬了。
BTrace 脚本
写到这里,唯一能阻碍我们继续下去的,就是怎么写 BTrace 脚本了。
首先,推荐在集成工具(IDEA、Eclipse)中编写 BTrace 脚本,引入 BTrace 的依赖:
<dependency>
<groupId>com.sun.tools.btrace</groupId>
<artifactId>btrace-agent</artifactId>
<version>1.2.3</version>
<type>jar</type>
<scope>system</scope>
<systemPath>D:\btace\libs\btrace-agent.jar</systemPath>
</dependency>
<dependency>
<groupId>com.sun.tools.btrace</groupId>
<artifactId>btrace-boot</artifactId>
<version>1.2.3</version>
<type>jar</type>
<scope>system</scope>
<systemPath>D:\btace\libs\btrace-boot.jar</systemPath>
</dependency>
<dependency>
<groupId>com.sun.tools.btrace</groupId>
<artifactId>btrace-client</artifactId>
<version>1.2.3</version>
<type>jar</type>
<scope>system</scope>
<systemPath>D:\btace\libs\btrace-client.jar</systemPath>
</dependency>
先来看一个简单的 Demo 示例:
@BTrace//表示这是一个BTrace跟踪脚本
public class Hello {
@OnMethod(clazz = "org.jvm.demo.chapter4.btrace.BtraceCase", // 全类名
method = "add", // 方法名
location = @Location(Kind.RETURN) // 表示跟踪某个类的某个方法,位置为方法返回处
)
public static void run(@Self Object self, int a, int b, // 入参,按顺序定义
@Return int result, // 出参
@Duration long time // 方法耗时
) {
BTraceUtils.print("打印入参, a = " + a + ",b=" + b);
BTraceUtils.print("打印出参, result = " + result);
BTraceUtils.print("打印耗时,time = " + time);
}
}
btrace.bat 4284 src/main/java/org/jvm/demo/chapter4/btrace/Hello.java
BTrace 主要有两类注解需要学习,一类是探测方法的注解,像上面的 @OnMethod 注解,类似的还有 @OnTimer、@OnError、@OnExit、@OnEvent、@OnLowMemory、@OnProbe 等等;另一类是探测方法参数的注解,像上面的 @Return、@Duration、@Self,类似的还有 @ProbeMethodName、@ProbeClassName、@TargetInstance、@TargetMethodOrField 等等
本文不过分说明 BTrace 的语法,私以为平常遇到什么样的业务场景,边学边用就是了,以下是官方的一些 BTrace 资料:
由于 BTrace 的安全和性能考虑,一般情况下不允许在探查方法中调用 BTraceUtils 以外的其它方法,但可使用 unsafe 模式。
BTrace 植入过的代码,会一直在,直到应用重启为止。所以即使 Btrace 退出了,业务函数每次执行时都会多出一次 Btrace 是否 Attach 状态的判断。
为了保证程序的安全,BTrace对编写的脚本进行了一些限制,比如不允许在脚本中创建对象,不允许在脚本中抛出异常等,更详细的限制请参考 BTrace 使用限制。
推荐阅读:
JVM系列十(虚拟机性能监控神器 - BTrace).的更多相关文章
- 深入理解JVM(③)虚拟机性能监控、故障处理工具
前言 JDK的bin目录中有一系列的小工具,除了java.exe.javac.exe这两个编译和运行Java程序外,还有打包.部署.签名.调试.监控.运维等各种场景都会用到这些小工具. 这些工具根据软 ...
- 【JVM.3】虚拟机性能监控与故障处理工具
一.概述 经过前面两章对于虚拟机内存分配与回收技术各方面的介绍,相信读者已经建立了一套比较完整的理论基础.理论总是作为指导实践的工具,能把这些执行应用到实际工作中才是我们的最终目的.接下来我们会从实践 ...
- 《深入理解Java虚拟机》(四)虚拟机性能监控与故障处理工具
虚拟机性能监控与故障处理工具 详解 4.1 概述 本文参考的是周志明的 <深入理解Java虚拟机> 第四章 ,为了整理思路,简单记录一下,方便后期查阅. JDK本身提供了很多方便的JVM性 ...
- Java虚拟机性能监控与调优实战
From: https://c.m.163.com/news/a/D7B0C6Q40511PFUO.html?spss=newsapp&fromhistory=1 Java虚拟机性能监控与调 ...
- JYM虚拟机性能监控与故障处理工具
虚拟机性能监控与故障处理工具 一.jps:虚拟机进程状况工具 常用指令 二.jstat:虚拟机统计信息监视工具 常用指令 三.jinfo:配置信息工具 四.jmap:Java内存映像工具 常用指令 五 ...
- jvm系列(五):tomcat性能调优和性能监控(visualvm)
tomcat服务器优化 1.JDK内存优化 根据服务器物理内容情况配置相关参数优化tomcat性能.当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃.因此一般建议堆的最 ...
- jvm虚拟机性能监控与故障处理工具
java开发人员肯定知道jdk的bin目录中有java.exe javac.exe这两个命令行工具,但并非所有程序员都了解过jdk的bin目录之中其他命令行的作用.jdk的工具,体积都比较小,这些命令 ...
- 阿里巴巴开源性能监控神器Arthas jvm
原文:https://www.cnblogs.com/testfan2019/p/11038791.html 如果问性能测试中最难的是哪部分,相信很多人会说“性能调优”.确实是这样,性能调优是一个非常 ...
- 《深入理解Java虚拟机》-----第4章 虚拟机性能监控与故障处理工具
理论总是作为指导实践的工具,能把这些知识应用到实际工作中才是 我们的最终目的. 给一个系统定位问题的时候,知识.经验是关键基础,数据是依据,工具是运用知识处理数据的手段.这里说的数据包括:运行日志.异 ...
随机推荐
- numpy——>数组拼接np.concatenate
语法:np.concatenate((a1, a2, ...), axis=0) 1.默认是 axis = 0,也就是说对0轴(行方向)的数组对象,进行其垂直方向(axis=1)的拼接(即数据整行整行 ...
- 树链剖分与倍增求LCA
树链剖分与倍增求\(LCA\) 首先我要吐槽机房的辣基供电情况,我之前写了一上午,马上就要完成的时候突然停电,然后\(GG\)成了送链剖分 其次,我没歧视\(tarjan LCA\) 1.倍增求\(L ...
- (转)协议森林05 我尽力 (IP协议详解)
协议森林05 我尽力 (IP协议详解) 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! IPv4与IPv6头部的对比 我们已经在I ...
- 使用Github Packages功能上传nuget包到Github
前几天微软收购npm的新闻对于软粉来收很是振奋.微软收购npm很可能是为了加强Github Packages.目前Github,Typescript,VSCode,npm这些开源社区的重磅工具全部都在 ...
- Antd 表格内通过rowClassName实现隔行变色的显示方法(转载)
ant design中 table组件很方便,在项目中遇到了需要实现奇偶行颜色不同以方便阅读的功能,主要用到了rowClassName这一api,通过判断index的奇偶来实现不同的样式分配. row ...
- .NET 5 Preview 1的深度解读和跟进
这几天微软.NET 团队发布了.NET 5 Preview-1, 如约而至.很兴奋,因为.NET Core和.NET Framework终于实现了大一统,同时也很期待,期待.NET 5能给我们带来哪些 ...
- iOS开发如何面对疫情过后的面试高峰期 !
2020年本应该是一个 "爱你.爱你"的年份!却因为 黑天鹅 给我们带来非常大的影响! 一.2020年iOS招聘数据分析 这里是 2020年3月份BOSS直聘 北京iOS招聘前几页 ...
- 基于Docker搭建Nginx图片服务器
前言 一般开发中,都会把图片上传到一个目录,然后将目录和文件名拼接存储在数据库中,但是,这种方法如果没弄好的话可能有一定的缺陷. 若项目搬迁,即时这台服务器本身还在用,存放在服务器的跟项目相关的图片也 ...
- hdu3973 AC's String 线段树+字符串hash
题目链接:http://icpc.njust.edu.cn/Problem/Hdu/3973/ 题意是:给出一个模式串,再给出一些串组成一个集合,操作分为两种,一种是替换模式串中的一个字符,还有一种是 ...
- 一文看懂NLP神经网络发展历史中最重要的8个里程碑!
导读:这篇文章中作者尝试将 15 年的自然语言处理技术发展史浓缩为 8 个高度相关的里程碑事件,不过它有些偏向于选择与当前比较流行的神经网络技术相关的方向.我们需要关注的是,本文中介绍的许多神经网络模 ...