【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可以通过编写脚本的方式,获取程序执行过程中的一切信息,并且,注意了,不用重启服务,是的,不用重启服务。写好脚本,直接用命令执行即可,不用动原程序的代码。



相关文章
|
1天前
|
SQL 监控 Java
技术前沿:Java连接池技术的最新发展与应用
本文探讨了Java连接池技术的最新发展与应用,包括高性能与低延迟、智能化管理和监控、扩展性与兼容性等方面。同时,结合最佳实践,介绍了如何选择合适的连接池库、合理配置参数、使用监控工具及优化数据库操作,为开发者提供了一份详尽的技术指南。
16 7
|
2天前
|
Java 数据格式 索引
使用 Java 字节码工具检查类文件完整性的原理是什么
Java字节码工具通过解析和分析类文件的字节码,检查其结构和内容是否符合Java虚拟机规范,确保类文件的完整性和合法性,防止恶意代码或损坏的类文件影响程序运行。
|
2天前
|
Java API Maven
如何使用 Java 字节码工具检查类文件的完整性
本文介绍如何利用Java字节码工具来检测类文件的完整性和有效性,确保类文件未被篡改或损坏,适用于开发和维护阶段的代码质量控制。
|
5天前
|
Web App开发 Java
使用java操作浏览器的工具selenium-java和webdriver下载地址
【10月更文挑战第12天】Selenium-java依赖包用于自动化Web测试,版本为3.141.59。ChromeDriver和EdgeDriver分别用于控制Chrome和Edge浏览器,需确保版本与浏览器匹配。示例代码展示了如何使用Selenium-java模拟登录CSDN,包括设置驱动路径、添加Cookies和获取页面源码。
|
4天前
|
移动开发 前端开发 JavaScript
java家政系统成品源码的关键特点和技术应用
家政系统成品源码是已开发完成的家政服务管理软件,支持用户注册、登录、管理个人资料,家政人员信息管理,服务项目分类,订单与预约管理,支付集成,评价与反馈,地图定位等功能。适用于各种规模的家政服务公司,采用uniapp、SpringBoot、MySQL等技术栈,确保高效管理和优质用户体验。
|
4天前
|
SQL 监控 Java
Java性能优化:提升应用效率与响应速度的全面指南
【10月更文挑战第21】Java性能优化:提升应用效率与响应速度的全面指南
|
5天前
|
Java
Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口
【10月更文挑战第20天】《JAVA多线程深度解析:线程的创建之路》介绍了Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口。文章详细讲解了每种方式的实现方法、优缺点及适用场景,帮助读者更好地理解和掌握多线程编程技术,为复杂任务的高效处理奠定基础。
15 2
|
1天前
|
Java 开发者
Java中的多线程基础与应用
【10月更文挑战第24天】在Java的世界中,多线程是提高效率和实现并发处理的关键。本文将深入浅出地介绍如何在Java中创建和管理多线程,以及如何通过同步机制确保数据的安全性。我们将一起探索线程生命周期的奥秘,并通过实例学习如何优化多线程的性能。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开一扇通往高效编程的大门。
7 0
|
监控 Java 应用服务中间件
|
监控 Java 应用服务中间件