字节码

简介:

学 JVM 是要学写什么,掌握到什么程度?

作为使用者需要了解基本结构。只是看静态的结构比较枯燥,且难以理解结构的作用,为什么要这样设计,另外也不知道自己了解的深度够不够。

学习字节码,可以让你在 JVM 的工作过程中看结构如何发挥作用&联动,这样就会生动得多,并且到字节码这个程度理解结构,深度也够了。

字节码表

Java bytecode 叫字节码,就是 8 位的,现在也还没用完,也就是说还没超过 128 个。在 JVM 里面这些就是最原子的操作符了。

一些有意思的设计

iload_0: load an int value from local variable 0
iload: load an int value from a local variable #index

iload_0 后面不需要再跟一个字节表示第几个 local variable,这样设计是节省字节码文件的空间的。有很多类似的设计。

工作机制

宏观一点看,Java 程序是从一个入口方法进入执行一个接一个的方法,直到退出。微观一点,方法的结构就是一行一行的字节码,JVM 就是读取字节码的指令,一步步操作。

根据我接触到的字节码,我理解主要是三种类型

  1. push data into operand stack
    数据来源可能是 local variables, constant pool 也可能字节码自带了数据,比如 iconst_0
  2. pop data from operand stack & do sth
    比如

fcmpl: 按 float 型 pop 出两个数据,比较大小,根据比较结果 push 一个 int 型到 stack 里
ifle: 按 int 型 pop 出一个数据,和 0 比较,若小于等于则跳转到 ifle 后面跟着的 branchoffset 处

  1. 对 operand stack 没有操作
    goto

参考资料

  1. Java bytecode instruction listings - Wikipedia
  2. 从Java代码到字节码(1) - ImportNew
目录
相关文章
|
6月前
javap反编译字节码文件
javap反编译字节码文件
|
7月前
|
存储 Arthas Java
【JVM系列笔记】字节码
本文介绍了Java虚拟机(JVM)的组成,包括类加载子系统、运行时数据区、执行引擎和本地接口。字节码文件由基础信息(如魔数和版本号)、常量池、字段、方法和属性组成。常量池用于存储字符串等共享信息,方法区则包含字节码指令。执行引擎包含解释器、即时编译器和垃圾回收器,负责字节码的解释和优化。文章还提到了字节码工具,如javap、jclasslib和Arthas,用于查看和分析字节码。
92 0
【JVM系列笔记】字节码
|
7月前
|
算法 Java 编译器
从Java字节码到JIT编译器,深入理解Java虚拟机
Java虚拟机(JVM)是Java程序运行的关键。想深入理解Java虚拟机,我们需要了解Java字节码、类加载机制、垃圾回收算法、JIT编译器等方面的知识。本文将介绍这些关键知识点,并通过示例代码加深理解。
|
7月前
|
存储 安全 Java
深入理解Java字节码与反编译技术
深入理解Java字节码与反编译技术
127 0
|
7月前
|
存储 Java 编译器
深入理解JVM - 字节码指令
深入理解JVM - 字节码指令
121 0
|
存储 Java 编译器
jvm之字节码指令集解读(上)
jvm之字节码指令集解读(上)
|
存储 监控 NoSQL
DynamicEntity - 字节码生成实践
在 MVC、MVVM 等分层架构中,一般是让 Model/ Entity 类尽量纯净,只有属性和一堆的 setter/getter 方法,但是在复杂的需求场景下,我们又经常会使得它变得不那么纯净。
113 0
|
Java 编译器 程序员
字节码插桩(四) | AST
我们通过 AndroidStudio 生成Bean对象一般是通过注解来实现自动生成getter/setter方法、equals()和hashCode()方法,其中类(或接口)要符合驼式命名法,首字母大写。方法要符合驼式命名法,首字母小写,类或实例变量要符合驼式命名法,首字母小写。常量要求全部由大写字母或下划线构成,且第一个字符不能是下划线,否则编译器会报警告
174 0
字节码插桩(四) | AST
|
存储 人工智能 Java
通过字节码分析i++ 与 ++i
通过字节码分析i++ 与 ++i
|
Java 编译器
字节码文件
字节码文件
169 0