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

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也与字节码增强密切相关,它们实质上还是利用各种手段生成符合规范的字节码文件。

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

关注公众号:架构进化论,获得第一手的技术资讯和原创文章

python字节码解析_从底层入手,解析字节码增强和Btrace应用相关推荐

  1. idea如何反编译字节码指令_美团点评:Java字节码增强技术,线上问题诊断利器...

    作者简介:泽恩,美团到店住宿业务研发团队工程师.文章转载于公众号:美团技术团队 1. 字节码 1.1 什么是字节码? Java之所以可以"一次编译,到处运行",一是因为JVM针对各 ...

  2. delphi查看源码版本_[Mybatis]-IDEA导入Mybatis源码

    该系列文章针对 Mybatis 3.5.1 版本 一.下载 Mybatis 源码 step1.下载 Mybatis-3.5.1 源码 Mybatis 源码仓库地址 下载版本信息如下: 下载后进行解压, ...

  3. java 字节码查看_一种查看java字节码时显示方法调用关系图的方法与流程

    本发明涉及一种代码逻辑分析方法,具体涉及一种查看java字节码时显示方法调用关系图的方法. 背景技术: 目前软件反编译领域有不少对可执行文件进行反编译的工具如IDA,也有对Java代码生成的中间码文件 ...

  4. python深拷贝实现原理_从底层剖析Python深浅拷贝

    拷贝的用途 拷贝就是copy,目的在于复制出一份一模一样的数据.使用相同的算法对于产生的数据有多种截然不同的用途时就可以使用copy技术,将copy出的各种副本去做各种不同的操作. 值得一提的是绝大部 ...

  5. python后端工程师简历_【社招】字节跳动 - 后端开发工程师( Python Golang)-懂车帝...

    [字节跳动-懂车帝-后端开发工程师] 想加入最有梦想最年轻有活力的团队么,懂车帝研发团队呼唤你!懂车帝今年 3 岁,已经成为发展最快的汽车类资讯平台. 如果你热爱编程,热爱汽车,那么动动手指投出简历吧 ...

  6. python领域的名人_名人问题 算法解析与Python 实现 O(n) 复杂度 (以Leetcode 277. Find the Celebrity为例)...

    1. 题目描述 Problem Description Leetcode 277. Find the Celebrity Suppose you are at a party with n peopl ...

  7. python 分词工具对比_分词工具使用解析

    1.现有的分词工具包 由于中文文本词与词之间没有像英文那样有空格分隔,因此很多时候中文文本操作都涉及切词,因此我上网整理了一些中文分词工具.这些分词工具大都是基于JAVA语言. perminusmin ...

  8. 位地址和字节地址换算_修改飞机24位地址码

    航空维修专业者,每天和你分享不一样的飞机新鲜事! 以下文章来源于公众号: 九品机务--机务君 目前大多数的民航客机都安装有S模式应答机,在之前的文章中也有过简单介绍,相较于A模式和C模式的应答机,S模 ...

  9. python爬取同花顺_网络爬虫页面解析的疑问?同花顺-问财

    http://stock.10jqka.com.cn/company.shtml 搜了下汽车 25条信息 直接用爬虫爬这个网址,http://www.iwencai.com/stockpick/sea ...

最新文章

  1. InstallShield 常用常量
  2. php员工积分绩效,详解绩效积分奖励制
  3. 漫步微积分二十三——重力作用下的运动 逃逸速度和黑洞
  4. spark学习-76-目标:如何成为大数据Spark高手
  5. getallheaders函数在服务器报500错误_「干货」服务器性能优化的8种常用方法
  6. ubuntu使用git时,终端不显示git分支。
  7. [转载] Python学习之numpy函数 all()和any()比较矩阵
  8. 聚类分析matlab算例,应用Matlab聚类方法分析大坝监测资料
  9. IIS安装及ASPNet开发环境配置
  10. U盘文件变成exe后被杀毒消失
  11. 导弹防御系统java_导弹防御问题 动态规划 java
  12. 第十五讲:达索系统锂电池行业解决方案在线直播 | 达索系统百世慧
  13. 从致敬KAWS系列盲盒大火,看“NFT+盲盒”玩法的想象空间
  14. let、const、var的区别
  15. Hadoop(二):入门
  16. i3够晚rust吗_【译】理解Rust中的Futures (一)
  17. 使用 dockerfile 构建 WordPress 环境
  18. goaccess的安装、使用及介绍【实操完整版】
  19. C语言字符串中使用宏替换
  20. 浅谈LCA的几种算法

热门文章

  1. 深度学习者的入门福利-Keras深度学习笔记
  2. 搜索推荐炼丹笔记:酒店搜索位置偏差的边际重要性
  3. 0315互联网新闻 | 小红书测试短视频产品“hey”;华为与故宫共同打造“5G智慧故宫”...
  4. 热备份路由选择协议(HSRP)
  5. python基础===使用switch方法,减少使用if语句
  6. TCPIP,Http,Socket的区别
  7. Windows系统中让硬盘更快的九大绝招
  8. Windows10下的AlphaPose配置,人体摔倒姿态识别
  9. 【tensorflow】安装cuda10.0 and cudnn 7.5.0 and tensorflow-gpu==1.14.0
  10. 视觉盛宴篇!推荐 12 个好用的 CSS 的开源项目,YYDS !