执行引擎是Java虚拟机最核心的组成部分之一。
物理机的执行引擎是直接建立在处理器、硬件、指令集和操作系统层面上的,而虚拟机的执行引擎则是由自己实现的,因此可以自行制定指令集与执行引擎的结构体系,并且能够执行那些不被硬件直接支持的指令集格式。
在不同的虚拟机实现里面,执行引擎在执行Java代码的时候可能会有解释执行和编译执行两种选择,也可能两者兼备,甚至还可能会包含几个不同级别的编译器执行引擎。
栈帧
栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区中的虚拟机栈的栈元素。
栈帧存储了方法的局部变量表,操作数栈,动态链接和方法返回地址等信息。每一个方法从调用开始至执行完成的过程,都对应着一个栈帧在虚拟机栈里面从入栈到出栈的过程。
在编译期间,栈帧中需要多大的局部变量表,多深的操作数栈都已经完全确定了,并且写入到方法表的Code属性之中,因此 一个栈帧需要分配多少内存,不会受到程序运行期变量数据的影响,而仅仅取决于具体的虚拟机实现。
局部变量表
局部变量表是一组变量值存储空间,用于存储方法参数和方法内部定义的局部变量。
局部变量表的容量以变量槽位最小单位,虚拟机规范里面并没有明确指明一个Slot应占用的内存空间大小,它允许Slot的长度可以随着处理器、操作系统或虚拟机的不同而发生变化。
类变量有两次赋初始化值得过程,一次是在准备阶段,赋予系统初始值;另外一次是在初始化阶段,赋予程序员定义得初始化值。因此,即使在初始化