首先假设我们有如下的代码:
经编译后得到的字节码如下,前面的数字是指令地址:
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