解释器执行过程与栈帧结构
栈帧
栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构,是虚拟机运行时数据区中的虚拟机栈的栈元素
只有位于栈顶的栈帧才是有效的(当前栈帧)
局部变量表
局部变量表是一组变量值存储空间,用于存放方法参数和方法内部定义的局部变量。
局部变量表的容量以变量槽slot为最小单位。的每个Slot是32位,高位对齐
操作数栈
后入先出栈。
方法的执行过程中,各种字节码指令往操作数栈中写入和提取内容。
动态连接
指向运行时常量池中该栈帧所属方法的引用。
基于栈的解释器执行过程
public int calc(){
int a=100;
int b=200;
int c=300;
return (a+b)*c;
}
STEP 1:程序计数器:1
此时,执行偏移地址为1的指令:
- 将100取出,放入操作栈的栈顶
STEP 2:程序计数器:2-10
此时,执行偏移地址为2的指令:
- istore_1指令的作用是将整个操作数栈顶的整型值出栈,并存放到第一个局部变量的Slot中
- 后续4条指令(直到偏移为11的指令为止),都是做一样的事,即将对应代码的变量abc赋值为100,200,300(放入局部变量表中)
STEP 3:程序计数器:11-13-15
执行偏移地址为11,12的指令:
- 读取局部变量1,2上的变量值,放入操作数栈中
执行偏移地址为13的指令:
- 将操作数的两个数相加
执行偏移地址为14,15的指令:
- 读取局部变量3上的变量值,放入操作数栈中
- 将操作数栈顶的两个元素相乘
STEP 4:程序计数器:16
返回值