一 操作数栈
Java 字节码是 Java 虚拟机所使用的指令集。因此,它与 Java 虚拟机基于栈的计算模型是分不开的。
在解释执行过程中,每当为 Java 方法分配栈帧时,Java 虚拟机往往需要开辟一块额外的空间作为操作数栈,来存放计算的操作数以及返回结果。
具体来说,执行每一条指令前,Java 虚拟机要求该指令的操作数已被压入操作数栈中。在执行指令时,Java 虚拟机会将该指令所需的操作数弹出,并且将指令结果重新压入栈中。
以加法指令 iadd 为例。假设在执行该指令前,栈顶的两个元素分别为 int 值 1 和 2,那么 iadd 指令将弹出中两个 int,并将求得的和 int 值 3 压入栈中。
由于 iadd 指令只消耗栈顶的两个元素,因此,对于离栈顶距离为 2 的元素,即图中问号,iadd 指令并不关心它是否存在,更加不会对其进行修改。
二 局部变量表
Java 方法栈帧的另外一个重要组成部分是局部变量表,字节码程序可以将计算的结果缓存在局部变量表之中。
实际上,Java 虚拟机将局部变量表当成一个数组,依次存放 this 指针(非静态方法),所传入的参数,以及字节码中的局部变量。
和操作数栈一样,long 类型以及 double 类型的值将占据两个单元&#