执行引擎在执行Java代码的时候可能会有解释执行(通过解释器执行)和编译执行(通过即时编译器产生本地代码执行)两种选择,也可能兼备。但从外观上看都是一致的:输入的是字节码文件,处理过程是字节码解析的等效过程,输出的是执行结果。
栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构,是虚拟机运行时数据区中的虚拟机栈的栈元素。栈帧中存储了方法的局部变量表,操作数栈,动态连接和方法返回地址等信息。每一个方法从调用开始至执行完成的过程都对应着一个栈帧在虚拟机栈里面从入栈到出栈的过程。
1. 局部变量表
1. 局部变量表:是一组变量值存储空间,用于存放方法参数和方法内部定义的局部变量。在Java文件编译为Class文件使,就在方法的code属性的max_locals数据项中确定了该方法所需要分配的局部变量表的最大容量。
2. 局部变量表的容量以变量槽Slot为最小单位。默认存储32位的类型数据,如果是64位,则分配连续两个槽。
3.定义局部变量必须初始化,不然编译不通过。类变量可以不初始化,因为类变量在类加载额准备阶段会被初始化为一个零值。
2. 操作数栈
1. 它是一个后入先出的栈。
2.Java虚拟机的解释执行引擎称为“基于栈的执行引擎”,其中所指的栈就是操作数栈。
3. 动态连接
1. 每个栈帧都包含一个指向运行时常量池中该栈帧所属方法的引用,该引用就是为了支持方法调用过程中的动态连接。
2. 符号引用转化为直接引用有两种方式:静态解析和动态连接。
4. 方法返回地址
1. 方法开始后有两种方式可以退出:正常退出和异常退出。
2. 正常完成出口:执行引擎遇到任意一个方法返回的字节码指令。
3. 异常完成出口:在执行过程中遇到了异常,并且这个异常没有在方法体内得到处理。并且异常方式退出不会给它的上层调用者产生任何返回值。
网友评论