欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

jvm代码深入追踪-操作数栈-局部变量表-pc寄存器的执行过程

程序员文章站 2022-05-12 14:02:23
...
public class OperandStackTest {
    public void testAddOperation() {
        byte i = 15;
        int j = 8;
        int k = i + j;
    }

byte、short、char、boolean:都是int型来保存的(当然int本身也是用int型来保存的),long和double都是占64位。
jvm代码深入追踪-操作数栈-局部变量表-pc寄存器的执行过程

所以在jclasslib中存的是用int类型存储的,bipush。

取的时候,也是用int类型存储的,即iload。

分析

jvm代码深入追踪-操作数栈-局部变量表-pc寄存器的执行过程

1.首先pc寄存器存的指令地址为0,所以执行bipush操作指令,将byte类型的15转为int类型压入操作数栈。

2.然后pc寄存器的指令地址变为2,则执行istore_1操作指令,意思是将上面的15存在局部变量表的下标为1的位置。有人可能会问,为什么局部变量表会从1开始,而不是从0开始。

非静态的方法,局部变量表0的位置存放的是this。
jvm代码深入追踪-操作数栈-局部变量表-pc寄存器的执行过程

jvm代码深入追踪-操作数栈-局部变量表-pc寄存器的执行过程

3.pc寄存器指令地址为3,执行操作指令bipush,将8再压入栈中。

4.pc寄存器指令地址5,执行操作指令istore_2,将栈顶的8存入局部变量表2的位置

这时,操作数栈是空的了

jvm代码深入追踪-操作数栈-局部变量表-pc寄存器的执行过程

  1. pc寄存器指令地址为6,执行操作指令iload_1,意思就是将局部变量表中1的位置的数据压入操作数栈中。

  2. 同样,pc寄存器指令地址为7,执行操作指令iload_2,意思就是将局部变量表中2的位置的数据压入操作数栈中。

    此时,栈顶指针指向的是8。

jvm代码深入追踪-操作数栈-局部变量表-pc寄存器的执行过程

7.pc寄存器指令地址为8,执行操作指令iadd,意思就是将操作数栈中的两个数进行出栈相加后再压栈,也就是8+15=23,将23再压栈,如上图。(这里的相加是通过执行引擎,最终在cpu相加,具体看后面文章,这边先不细说)

  1. pc寄存器指令地址为9,执行操作指令istore_3,意思就是将操作数栈顶元素23存入局部变量表中位置为3的地方。
  2. 最终return返回。