Java Virtual Machine Stacks:与程序计数器一样,Java 虚拟机栈也是线程私有的,它的生命周期与线程相同。
虚拟机栈描述的是Java方法执行的内存模型
:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表
、操作栈
、动态链接
、方法出口
等信息。每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。
栈是一个先入后出(FILO-First In Last Out)的有序列表。在活动线程中,只有位于栈顶的栈帧才是有效的,称为当前栈帧。正在执行的方法称为当前方法,栈帧是方法运行的基本结构。在执行引擎运行时,所有指令都只能针对当前栈帧进行操作。
[](()局部变量表
局部变量表是存放方法参数和局部变量的区域。局部变量没有准备阶段,必须显式初始化。全局变量是放在堆的,有两次赋值的阶段,一次在类加载的准备阶段,赋予系统初始值;另外一次在类加载的初始化阶段,赋予代码定义的初始值。
[](()操作栈
操作栈是个初始状态为空的桶式结构栈(先入后出)。当一个方法刚刚开始执行的时候,这个方法的操作数栈是空的,在方法的执行过程中,会有各种字节码指令往操作数栈中写入和提取内容,也就是出栈/入栈操作。
[](()动态链接
每个栈帧都包含一个指向运行时常量池中对当前方法的引用,目的是支持方法调用过程的动态连接。当前方法中如果需要调用其他方法的时候,能够从运行时常量池中找到对应的符号引用,然后将符号引用转换为直接引用,然后就能直接调用对应方法。
不是所有方法调用都需要动态链接的,有一部分符号引用会在类加载解析阶段
将符号引用转换为直接引用,这部分操作称之为: 静态解析
,就是编译期间就能确定调用的版本,包括: 调用静态方法, 调