学 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 就是读取字节码的指令,一步步操作。
根据我接触到的字节码,我理解主要是三种类型
- push data into operand stack
数据来源可能是 local variables, constant pool 也可能字节码自带了数据,比如 iconst_0 - pop data from operand stack & do sth
比如
fcmpl: 按 float 型 pop 出两个数据,比较大小,根据比较结果 push 一个 int 型到 stack 里
ifle: 按 int 型 pop 出一个数据,和 0 比较,若小于等于则跳转到 ifle 后面跟着的 branchoffset 处
- 对 operand stack 没有操作
goto