简单分析字节码指令执行中pc程序计数器,局部变量表,操作数栈的变化情况

首先假设我们有如下的代码:
在这里插入图片描述
经编译后得到的字节码如下,前面的数字是指令地址:

0 bipush 15
2 istore_1
3 bipush 8
5 istore_2
6 iload_1
7 iload_2
8 iadd
9 istore_3
10 return

现在从最开头的指令开始,一步一步分析pc程序计数器,局部变量表,操作数栈的变化情况:

0 bipush 15 :将15压入操作数栈
pc寄存器:0
局部变量表:序号0:this引用
操作数栈:15

2 istore_1:将操作数栈的15出栈,并将15存入局部变量表的位序为1的槽中,因为0被this的引用占据了
pc寄存器:2
局部变量表:序号0:this引用, 序号1:15
操作数栈:

3 bipush 8:将8压入操作数栈
pc寄存器:3
局部变量表:序号0:this引用, 序号1:15
操作数栈:8

5 istore_2:将8出栈,并存入局部变量表位序为2的位置
pc寄存器:5
局部变量表:序号0:this引用,序号1:15 , 序号2:8
操作数栈:

6 iload_1:加载局部变量表序号为1的值出来
pc寄存器:6
局部变量表:序号0:this引用,序号1:15 ,序号2:8
操作数栈:15

7 iload_2:加载局部变量表序号为2的值出来
pc寄存器:7
局部变量表:序号0:this引用,序号1:15 , 序号2:8
操作数栈:15 8

8 iadd:将操作数栈的15和8都出栈,并由执行引擎执行相加的字节码指令,将结果放入操作数栈中
pc寄存器:8
局部变量表:序号0:this引用,序号1:15 ,序号2:8
操作数栈:23

9 istore_3:将相加的结果23出栈,存入局部变量表序号为3大的槽中
pc寄存器:9
局部变量表:序号0:this引用,序号1:15 ,序号2:8, 序号3:23
操作数栈:

10 return:结束(没有返回值)
pc寄存器:10
局部变量表:序号0:this引用,序号1:15 ,序号2:8, 序号3:23
操作数栈:

从以上可以看出,局部变量表的最大长度为4,操作数栈的最大深度为2
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/lyd135364/article/details/120807983