美文网首页
从底层入手,解析字节码增强和Btrace应用

从底层入手,解析字节码增强和Btrace应用

作者: 邴越 | 来源:发表于2020-02-20 18:10 被阅读0次

这篇文章聊下字节码和相关的应用。

1、机器码和字节码

机器码(machine code),学名机器语言指令,有时也被称为原生码(Native Code),是电脑的CPU可直接解读的数据。

通常意义上来理解的话,机器码就是计算机可以直接执行,并且执行速度最快的代码。

用机器语言编写程序,编程人员要首先熟记所用计算机的全部指令代码和代码的涵义。手编程序时,程序员得自己处理每条指令和每一数据的存储分配和输入输出,还得记住编程过程中每步所使用的工作单元处在何种状态。这是一件十分繁琐的工作,编写程序花费的时间往往是实际运行时间的几十倍或几百倍。而且,编出的程序全是些0和1的指令代码,直观性差,还容易出错。

字节码(Bytecode)是一种包含执行程序、由一序列 op 代码/数据对 组成的二进制文件。字节码是一种中间码,它比机器码更抽象,需要直译器转译后才能成为机器码的中间代码。

通常情况下它是已经经过编译,但与特定机器码无关。字节码通常不像源码一样可以让人阅读,而是编码后的数值常量、引用、指令等构成的序列。

字节码主要为了实现特定软件运行和软件环境、与硬件环境无关。字节码的实现方式是通过编译器和虚拟机器。编译器将源码编译成字节码,特定平台上的虚拟机器将字节码转译为可以直接执行的指令。

字节码的典型应用为Java bytecode。字节码在运行时通过JVM(JAVA虚拟机)做一次转换生成机器指令,因此能够更好的跨平台运行。

2、字节码增强技术

Java字节码增强指的是在Java字节码生成之后,对其进行修改,增强其功能,这种方式相当于对应用程序的二进制文件进行修改。Java字节码增强主要是为了减少冗余代码,提高性能等。

实现字节码增强的主要步骤为:

(1)修改字节码

在内存中获取到原来的字节码,然后通过一些工具(如 ASM,Javaasist)来修改它的byte[]数组,得到一个新的byte数组。

(2)使修改后的字节码生效

有两种方法:

  • 自定义ClassLoader来加载修改后的字节码;
  • 替换掉原来的字节码:在JVM加载用户的Class时,拦截,返回修改后的字节码;或者在运行时,使用Instrumentation.redefineClasses方法来替换掉原来的字节码;

3、字节码增强有哪些实现

字节码增强技术有以下这些:

  • 动态代理
  • CGLIB
  • Javassist
  • asm

以 ASM 为例, 使用它可以动态修改类、方法,甚至可以重新定义类,连 CGLib 底层都是用 ASM 实现的。

4、Btrace原理和应用

BTrace是SUN Kenai云计算开发平台下的一个开源项目,旨在为java提供安全可靠的动态跟踪分析工具。

那么,BTrace这么神奇的功能是如何实现的呢?既然这是个开源的代码,那么直接从代码找原理。BTrace代码开源在https://github.com/btraceio/btrace

BTrace是基于动态字节码修改技术(Hotswap)来实现运行时java程序的跟踪和替换。大体的原理可以用下面的公式描述:

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

BTrace工作时序图如下:

BTrace就是使用ASM修改当前类,附加调试信息,得到新的类,一般情况下,Class文件是通过javac编译器产生的,然后通过类加载器加载到虚拟机内,再通过执行引擎去执行。现在可以通过ASM的API直接生成符合Java虚拟机规范的Class字节流,这样,ASM做的事情一定程度上正是javac解释器做的工作。

5、总结

字节码增强技术可以动态地对运行中的程序做修改,也可以跟踪JVM运行中程序的状态。此外,我们平时使用的动态代理、AOP也与字节码增强密切相关,它们实质上还是利用各种手段生成符合规范的字节码文件。

掌握字节码增强后可以高效地定位并快速修复一些棘手的问题(如线上性能问题、方法出现不可控的出入参需要紧急加日志等问题),也可以在开发中减少冗余代码,大大提高开发效率。

相关文章

  • 从底层入手,解析字节码增强和Btrace应用

    这篇文章聊下字节码和相关的应用。 1、机器码和字节码 机器码(machine code),学名机器语言指令,有时也...

  • Java 字节码增强技术 2019-02-01

    本文将介绍有哪些常见的字节码增强技术、字节码增强的实现方式、AOP实现的原理。 1. 字节码增强技术的应用场景: ...

  • BTrace的使用

    简介 BTrace可以动态地向目标应用程序的字节码注入追踪代码 所依赖的技术: JavaComplierApi、J...

  • 04.BTrace 监控与调试

    Jvm与调优 imooc JVM Markdown BTrace可以动态地向目标应用程序的字节码注入追踪代码BT...

  • Pinpoint技术细节

    本文将讲述Pinpoint的技术,如事务追踪和字节码增强。并介绍应用于Pinpoint Agent的优化方法,该方...

  • 字节码增强:原理与实战

    本文由一个拦截器逻辑的使用场景及演变历程,引入字节码增强技术。介绍字节码的本质,字节码增强的原理及JVM 启动过程...

  • 代码生成

    语法解析流程简述 lua之类的脚本语言先把源代码翻译成字节码,而后再使用虚拟机执行字节码。而从源代码到字节码要经过...

  • 27-javap指令

    一、解析字节码的意义 javap是JDK自带的反解析工具。它的作用就是根据 Class 字节码文件,反解析出当前类...

  • 奇门遁甲之字节码与JVM指令

    最近在研究ASM 字节码增强技术,要掌握ASM 必须要先连接Java字节码结构、JVM栈帧和常用JVM指令。 本章...

  • java基础知识,字节码执行引擎

    知识要点: 函数解析 静态分派 动态分派 字节码 函数解析 虚拟机方法字节码 在Java语言中符合“编译期可知,运...

网友评论

      本文标题:从底层入手,解析字节码增强和Btrace应用

      本文链接:https://www.haomeiwen.com/subject/xwxfqhtx.html