操作数栈,主要用于保存计算过程中的结果,同时作为集计算过程中变量临时的存储空间。
操作数栈就是JVM执行引擎的一个工作区,当方法执行开始,一个新栈帧也会随之被创建,这个方法的操作数栈是空的。
每一个操作数栈都会拥有一个明确的栈深入用于存储数据值。
我们说是java虚拟机的解释引擎是基于栈的执行引擎,其中的栈指的就是操作数栈。
如果被调用的方法带有返回值的话,其返回值将被压入当前栈帧操作数栈中。
反编译字节码文件
bipush:将值压入操作数栈的操作。
istore_1:将栈顶指针指向的值放入局部变量表中索引为1的地方。
iload_1:将局部变量表中索引为1的值压入操作数栈中
iadd:让操作数栈中数字纷纷出栈,通过 执行引擎进行add操作。
PC寄存器中存储第0的指令地址,然后对应指令地址执行对应的操作指令bipush。将15压入操作数栈,此时栈顶指针指向15。
PC寄存中存入2的地址指令,15出栈,进入局部变量表中索引为1的位置(istore_1)(索引为0的位置存放的this)
8压入操作数栈(bipush),然后出栈进入局部变量表索引为2的位置(istore_2)
iload_1 和 iload_2 分别将局部变量表中的15和8放入操作数栈中。
将操作数栈中的15和8分别出栈,进行iadd操作,相加后的值再次压入到操作数栈中。然后执行istore_3.。将23出栈,放入局部变量表索引为3的地方。
i = 0;
i = i++;
反编译:
数字的:1,2,..6,7:是pc寄存器存储的指令地址,指示执行对应的操作指令。
0:iconst_0; // 将int类型的0 入栈
1:istore_1; // 将栈顶0弹出,保存到局部变量 index索引值为1 的位置。
2:iload_1; // 将局部变量表 index 1位置的值的副本入栈,(此时:局部变量表 index为1的值是0,操作数栈顶的值是0)
3:iinc_1,1; // iinc是对int类型的值进行自增操作(局部变量表index 1的值执行了自增变为了1,单操作数栈中的值仍然为0)
6:istore_1; // 操作数栈顶的值弹出(值为 0),放到局部变量表index 1的位置(旧值:1,新值:0),覆盖到上一步的局部变量表中。
7:iload_1; // 将局部变量表index 1的位置的副本入栈
转发连接:https://blog.csdn.net/weixin_44717746/article/details/107774945
手机扫一扫
移动阅读更方便
你可能感兴趣的文章