【Java应用诊断工具】「BTrace」基本概念和原理的介绍(1)

简介: 【Java应用诊断工具】「BTrace」基本概念和原理的介绍(1)

系列文章


  • 「BTrace」基本概念和初步介绍(1)
  • 「BTrace」安装介绍和使用原理(2)- 未完成
  • 「BTrace」实战代码进行调试使用(3)- 未完成
  • 「BTrace」运行时异常原因分析(4)- 未完成

背景说明(痛点分析)

  • 线上遇到了问题
  • 服务上线出问题,想增加打印日志怎么办
  • 线上怀疑某个接口慢,想打印接口耗时怎么办
  • 线上某个接口报错,想看看调用的参数和谁调用了怎么办
  • 线上出错了,想看某个对象的数据怎么办
  • 线上出错了,想看一下jvm的一些信息怎么办
  • 不确定线上某一行代码执行了怎么办




传统解决方案


  • 修改源代码 -> 增加相关打印日志 -> hotswap(热加载+热刷新)
  • Thread.dumpStack():打印输出当前的堆中信息数据
  • beanshell可以查看内存数据
  • jvm信息可以通过jvm内置命令去获取:主要的办法就是jstack到处线程堆中信息



缺点


  • 代码侵入式
  • 不灵活
  • 源代码冗余
  • 如果你的服务不支持hotswap呢?




BTrace应用场景


  1. 服务慢,能找出慢在哪一步,哪个函数里么?
  2. 谁调用了System.gc(),调用栈如何?
  3. 谁构造了一个超大的ArrayList?
  4. 入参或对象属性,导致抛出了这个异常?进入了这个处理分支?
  5. 针对没有异常堆栈的情况,可以将异常实时输出。




BTrace基本介绍


Btrace是SUN公司开发的一款动态的Trace工具,是Java的安全可靠的动态跟踪工具。他的工作原理是通过instrument + asm来对正在运行的java程序中的class类进行动态增强。说他是安全可靠的,是因为它对正在运行的程序是只读的。也就是说,他可以插入跟踪语句来检测和分析运行中的程序,不允许对其进行修改。



BTrace开源地址


Btrace最大的好处是可以自己编写脚本,可以实时应用的调用信息,而不用频繁的重启系统。Btrace目前托管在Github上BTrace-Github官方地址BTrace官方文档。可以学习研究下

也可以直接点击Release,下载zip,解压即可使用




BTrace限制条件


因此他存在一些限制

  • 不能创建对象
  • 不能创建数组
  • 不能抛出和捕获异常
  • 不能调用任何对象方法和静态方法
  • 不能给目标程序中的类静态属性和对象的属性进行赋值
  • 不能有外部内部和嵌套类
  • 不能有同步块和同步方法
  • 不能有循环(for, while, do..while)
  • 不能继承任何的类
  • 不能实现接口
  • 不能包含assert断言语句

这些限制其实是可以使用unsafe模式绕过。通过声明 @BTrace(unsafe = true) annotation并且以unsafe模式-u运行btrace


实际使用非安全模式跟踪时,发现一个问题,一个进程如果被安全模式btrace探测过一次, 后面再使用非安全模式进行探测时非安全模式不生效




BTrace基本原理


总体来说,BTrace是基于动态字节码修改技术(Hotswap)来实现运行时 java 程序的跟踪和替换


大体的原理可以用下面的公式描述


Client(Java compile api + attach api) + Agent(脚本解析引擎 + ASM + JDK6 Instumentation) + Socket

其实BTrace就是使用了java attach api附加agent.jar,然后使用脚本解析引擎+asm来重写指定类的字节码,再使用instrument实现对原有类的替换




BTrace注意事项


合理利用Btrace确实会给线上定位问题提速不少,但是也要谨慎,尽量的将范围缩小,在执行Btrace脚本之前,先到测试环境测试一下,不然有可能让jvm奔溃。所以编写脚本的时候最好还是利用IDE来编写代码



BTrace最后总结


BTrace是检查和解决线上的问题的杀器,BTrace可以通过编写脚本的方式,获取程序执行过程中的一切信息,并且,注意了,不用重启服务,是的,不用重启服务。写好脚本,直接用命令执行即可,不用动原程序的代码。



目录
打赏
0
0
0
0
373
分享
相关文章
【JAVA】封装多线程原理
Java 中的多线程封装旨在简化使用、提高安全性和增强可维护性。通过抽象和隐藏底层细节,提供简洁接口。常见封装方式包括基于 Runnable 和 Callable 接口的任务封装,以及线程池的封装。Runnable 适用于无返回值任务,Callable 支持有返回值任务。线程池(如 ExecutorService)则用于管理和复用线程,减少性能开销。示例代码展示了如何实现这些封装,使多线程编程更加高效和安全。
【JAVA】生成accessToken原理
在Java中,生成accessToken用于身份验证和授权,确保合法用户访问受保护资源。流程包括:1. 身份验证(如用户名密码、OAuth 2.0);2. 生成唯一且安全的令牌;3. 设置令牌有效期并存储;4. 客户端传递令牌,服务器验证其有效性。常见场景为OAuth 2.0协议,涉及客户端注册、用户授权、获取授权码和换取accessToken。示例代码展示了使用Apache HttpClient库模拟OAuth 2.0获取accessToken的过程。
Java字面量详解:概念、分类与使用实例
本文介绍了Java字面量的概念、分类及应用。
49 11
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
228 9
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
Java中的this关键字详解:深入理解与应用
本文深入解析了Java中`this`关键字的多种用法
122 9
【潜意识Java】javaee中的SpringBoot在Java 开发中的应用与详细分析
本文介绍了 Spring Boot 的核心概念和使用场景,并通过一个实战项目演示了如何构建一个简单的 RESTful API。
41 5
【潜意识Java】了解并详细分析Java与AIGC的结合应用和使用方式
本文介绍了如何将Java与AIGC(人工智能生成内容)技术结合,实现智能文本生成。
58 5
Java的基础概念一
### Java编程基础简介 #### 一、注释 注释用于解释代码,不会参与编译和运行。Java支持三种注释: - **单行注释**:以 `//` 开头。 - **多行注释**:以 `/* ... */` 包围。 - **文档注释**:通常用于生成开发文档。 #### 二、关键字 关键字是被Java赋予特定含义的英文单词,全部小写,且在代码编辑器中有特殊颜色标记。常用的如 `class` 表示定义一个类。
Java的基础概念一
【潜意识Java】深入理解MyBatis,从基础到高级的深度细节应用
本文详细介绍了MyBatis,一个轻量级的Java持久化框架。内容涵盖MyBatis的基本概念、配置与环境搭建、基础操作(如创建实体类、Mapper接口及映射文件)以及CRUD操作的实现。此外,还深入探讨了高级特性,包括动态SQL和缓存机制。通过代码示例,帮助开发者更好地掌握MyBatis的使用技巧,提升数据库操作效率。总结部分强调了MyBatis的优势及其在实际开发中的应用价值。
32 1
Java的基础概念(二)
本文介绍了Java编程语言中的运算符和表达式,涵盖算术运算符、赋值运算符、关系运算符、逻辑运算符、三元运算符等。重点讲解了算术运算符的使用,如加减乘除取余,并强调了整数除法和取余的特殊性。同时,详细说明了隐式转换与强制转换的概念及应用场景,以及字符串和字符的拼接规则。通过多个案例演示了不同运算符的实际应用,包括数值拆分、自增自减、三元表达式的使用等。最后简要提及了运算符的优先级,指出小括号具有最高优先级。

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等