JVM学习笔记-第八章-虚拟机字节码执行引擎
8.1 概述
在《Java虚拟机规范》中制定了Java虚拟机字节码执行引擎的概念模型,在不同的虚拟机实现中,执行引擎在执行字节码的时候,通常会有解释执行(通过解释器执行)和编译执行(通过即时编译器产生本地代码执行)两种选择,也可能两者兼备等。
但从外观上来看,所有的Java虚拟机的执行引擎输入、输出都是一致的:输入的是字节码二进制流,处理过程是字节码解析执行的等效过程,输出的是执行结果,本章将主要从概念模型的角度来讲解虚拟机的方法调用和字节码执行。
8.2 运行时栈帧结构
Java虚拟机以方法作为最基本的执行单元,“栈帧”(Stack Frame)则是用于支持虚拟机进行方法调用和方法执行背后的数据结构,它也是虚拟机运行时数据区中的虚拟机栈(VirtualMachine Stack)的栈元素。
栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息。
每一个方法从调用开始至执行结束的过程,都对应着一个栈帧在虚拟机栈里面从入栈到出栈的过程。以Java程序的角度来看,同一时刻,同一条线程里面,在调用堆栈的所有方法都同时处于执行状态。对于执行引擎来说,在活动线程中,只有位于栈顶的方法才是在运行的,其被称为“当前栈帧”,与这个栈帧所关联的方法被称为“当前方法”。
8.2.1 局部变量表
局部变量表(Local Variables Table)是一组变量值的存储空间,用于存放方法参数和方法内部定义的局部变量。在Java程序被编译为Class文件时,就在方法的Code属性的max_locals数据项中确定了该方法所需分配的局部变量表的最大容量。
局部变量表的容量以变量槽(Variable Slot)为最小单位,《Java虚拟机规范》中并没有明确指出一个变量槽应占用的内存空间大小,只是很有导向性地说到每个变量槽都应该能存放一个boolean、byte、char、short、int、float、reference或returnAddress类型的数据。Java虚拟机会以高位对齐的方式为其分配两个连续的变量槽空间。
Java虚拟机通过索引定位的方式使用局部变量表。当一个方法被调用时,Java虚拟机会使用局部变量表来完成参数值到参数变量列表的传递过程,即实参到形参的传递。如果执行的是实例方法,那局部变量表中的第0位索引的变量槽默认是用于传递方法所属对象实例的引用。
8.2.2 操作数栈
操作数栈