帧栈、局部变量表、操作数栈

栈帧(frame)

栈帧是用来存储数据和部分过程结果的数据结构,同时也用来处理动态链接(dynamic linking)、方法返回值和异常分派(dispatch exception)。
栈帧随着方法的调用而创建,随着方法的销毁而销毁(无论方法正常执行还是抛异常都算方法结束)。栈帧的存储空间由创建他的线程分配在java虚拟机中,每一个栈帧都有自己的本地变量表(local variable)、操作数栈(operand stack)和指向当前方法所属的类的运行时常量池的引用。
在某个时间,只有目前正在执行的那个方法的栈帧是活动的这个栈称为当前栈(current frame),这个栈帧对应的方法叫当前方法(current  method),定义这个方法的类称为当前类(current class)。
在方法的结束或返回之际,当前栈帧会传回此方法的执行结果给前一个栈帧,然后虚拟机会丢弃当前栈,使前一个栈帧重新成为当前栈。
注意 栈帧是线程本地私有的数据,不可能在一个栈帧之中引用另外一个线程的栈帧。


 局部变量表

每个帧栈内部都包含一组称为局部变量表的变量列表。
局部变量表使用索引来进行定位访问。首个局部变量的索引为0;
java虚拟机使用局部变量表来完成方法调用时的参数传递;


 操作数栈 

每个栈帧内部都包含一个称为操作数栈的后进先出栈。栈帧中操作数的最大深度由编译期决定。
帧栈在刚刚创建时,操作数栈是空的。java虚拟机提供的一些字节码指令来从局部变量表或对象实例的字段中复制常量或变量值到操作数栈中,也提供了一些指令用于从操作数栈取走数据、操作数据以及把操作结果重新入栈。

在任意时刻,操作数栈都会有一个确定的栈深度,一个long或double类型的数据会占两个单位的栈深度,其他数据类型则会占用一个单位的栈深度。

变量想要被执行,就要加入到操作数栈中。

你可能感兴趣的:(帧栈、局部变量表、操作数栈)