字节码

学 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 处
  3. 对 operand stack 没有操作
    goto

参考资料

  1. Java bytecode instruction listings - Wikipedia
  2. 从Java代码到字节码(1) - ImportNew

推荐阅读更多精彩内容