方法
字节码文件中的方法区域是存放字节码指令的核心位置,字节码指令的内容存放在方法Code属性中。
操作数栈
操作数栈是临时存放数据的地方。
分析字节码指令的执行
示例代码:
int i = 0;
int j = i + 1;
该代码的字节码指令为
分析:
首先给操作数栈中赋0(iconst_0)
把数从栈中弹出,并赋值到i的位置(istore_1)
为什么i的位置是1,不是0?
因为在main方法中的String[] args占了0的位置了。
数的相加和比较需要在操作数栈中进行,所以执行到i+1时,系统需要取局部变量表的值和需要操作的值。
从i的位置取数据压栈(iload_1),和store不同的是,iload是赋值,不是剪切。
之后就是操作数栈压1,完成iadd操作,操作数栈此时为i+1=1。
最后执行istore_2把1给属性j的位置,完成所有操作后return。
经典面试题:
int i = 0;
i = i++;
i最后是多少?
首先我们看该程序的字节码指令
分析:
首先将0放到操作数栈中
把操作数栈中的值弹出到属性i的位置
因为i++是后执行的,需要先取到i的值
将本地变量表中指定的位置(x)增加(y)iinc 1 by 1
将操作数栈的值保存到局部变量表中
所以最后i是0
最后贴上++i的流程