8.1 概述
执行引擎是字节码是最核心的组成部分之一。执行引擎在执行java代码的时候,可能会有解释执行(通过解释器执行),和编译执行(通过及时编译器产生本地代码执行)二种选择。但是外观上看起来是一致的:输入的是字节码文件,处理的过程是字节码解析的等效过程,输出的是执行的结果。8.2 运行时栈帧结构
栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构。栈帧存储了局部变量表,操作数栈,动态链接和方法返回地址等信息和一些额外的附加信息。8.2.1 局部变量表
用来存放方法参数和方法内的局部变量。编译阶段就已经确定了局部变量表的大小。局部变量表的容量以变量槽为最小单位。long和double类型要占2个槽,需要分割为2次对内存的操作,但是虚拟机可以保证原子性,不允许单独访问其中的一个字节。虚拟机使用局部变量表完成参数值到参数变量表的传递。第0个slot默认用来传递方法所属对象的引用。其余参数暗战参数表顺序排列,占用从第1个开始的局部变量槽。 变量槽是可以重用的,不过这样的设计,除了会节省空间之外,还可以带来一些负面影响。1、可能会影响垃圾收集器的行为。2、局部变量表不像类变量一样,有二次赋初值的过程,第一次在准备阶段准备初值。局部变量表没有准备阶段,所以不会用默认的零值。必须赋初值才可以使用。