解释器执行过程与栈帧结构

栈帧

栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构,是虚拟机运行时数据区中的虚拟机栈的栈元素

栈帧结构

只有位于栈顶的栈帧才是有效的(当前栈帧)

局部变量表

局部变量表是一组变量值存储空间,用于存放方法参数和方法内部定义的局部变量。

局部变量表的容量以变量槽slot为最小单位。的每个Slot是32位,高位对齐

操作数栈

后入先出栈。

方法的执行过程中,各种字节码指令往操作数栈中写入和提取内容。

动态连接

指向运行时常量池中该栈帧所属方法的引用。

基于栈的解释器执行过程

public int calc(){
    int a=100;
    int b=200;
    int c=300;
    return (a+b)*c;
}

栈解释器到2的具体执行过程

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

返回值