第八章 虚拟机字节码执行引擎

第一节 概述

执行引擎是Java虚拟机最核心的组成部分之一,对于“物理机”,其执行引擎是直接建立在处理器,硬件,指令集和操作系统层面上的;而对于“虚拟机”,其执行引擎是由自己实现的,因此可以自行制定指令集和执行引擎的结构体系,并且能够执行那些不被硬件直接支持的指令集格式。 

执行引擎在执行Java代码的时候可能会有解释执行(通过解释器执行)编译执行(通过即时编译器产生本地代码执行)两种选择,也有可能两种兼备

第二节 运行时栈帧结构

1 栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区中的虚拟机栈的栈元素。

2 栈帧存储了方法的局部变量表操作数栈动态连接方法返回地址等信息

3 每个方法从调用开始至执行完成的过程都对应着一个栈帧在虚拟机栈里面从入栈到出栈的过程

4 一个栈帧需要分配多少内存,不会受到程序运行期变量数据的影响,而仅仅取决于具体的虚拟机实现

5 对于执行引擎来说,在活动线程中,只有位于栈顶的栈帧才是有效的,称为当前栈帧,与这个栈帧相关联的方法称为当前方法

一 局部变量表

1 局部变量表是一组变量值存储空间,用于存放方法参数方法内部定义的局部变量,在Java程序编译为Class文件时就确定了该方法所需要分配的局部变量表的最大容量

2 局部变量表的容量以变量槽(Slot)为最小单位,Slot的长度可以随着处理器,操作系统或虚拟机的不同而发生变化

3 对于reference数据类型,虚拟机实现至少都应当做到两点:一是从此引用中直接或间接地查找到对象在Java堆中的数据存放其实地址索引,二是此引用中直接或间接地查找数据类型在方法区中的存储的类型信息。

4 虚拟机通过索引定位的方式使用局部变量表,索引值的范围从0开始至局部变量表的最大的Slot的数量

对于两个相邻的共同存放一个64位数据的两个Slot,不允许采用任何方式单独访问其中的某一个

5 在方法执行时,虚拟机是使用局部变量表完成参数值到参数变量列表的传递过程的,如果执行的是实例方法,那局部变量表的第0位索引的Slot默认是用于传递方法所属对象实例的引用,在方法中可以通过关键字“this”来访问这个隐含的参数

public class Demo1 {

	public static void main(String[] args) {
//		局部变量表Slot复用对垃圾收集的影响
		byte[] placeholder = new byte[64*1024*1024];
		System.gc();
	}

}

可以看到虚拟机并没有回收内存,考虑会不会是因为变量placeholder还处在作用域之内,虚拟机不敢回收这部分内存的原因,于是我们将placeholder限制在花括号之内,看一下执行结果

public class Demo1 {

	public static void main(String[] args) {
//		局部变量表Slot复用对垃圾收集的影响
		{
		byte[] placeholder = new byte[64*1024*1024];
		}
		int a = 0;
		System.gc();
	}
	
}

placeholder能否被回收的根本原因是:局部变量表中的Slot是否还存有placeholder数组对象的引用

6 对于一个类变量(static声明的),如果在初始化阶段没有被赋值也没有关系,类变量仍然具有一个确定的初始值;但是, 如果一个局部变量定义了但没有赋初始值是不能使用的

二 操作数栈

1 操作数栈也成为操作栈,它是一个后进先出的栈。

2 操作数栈的最大深度在编译的时候写入到Code属性的max_stacks数据项中。,操作数栈的深度都不会超过max_stacks数据项中设定的最大值

3 操作数栈中元素的数据类型必须与字节码指令的序列严格匹配

三 动态连接

每个栈帧都包含一个指向运行时常量池中该栈帧所属方法的引用,持有这个引用是为了支持方法调用过程中的动态连接

四 方法返回地址

1 当一个方法开始执行时,有两种方式可以退出这个方法:

  • 正常完成出口:执行引擎遇到任意一个方法返回的字节码指令,这时候可能会有返回值传递给上层的方法调用者,是否有返回值和返回值的类型将根据遇到何种方法返回指令来决定
  • 异常完成出口:在方法执行过程中遇到了异常,并且这个异常没有在方法体内得到处理,只要是本方法表没有搜索到匹配的异常处理器,就会导致方法退出

2 无论采用何种退出方式,在方法退出后都要返回到方法被调用的位置,程序才能继续执行

3 动态连接,方法返回地址与其他费附加信息全部归为一类,称为栈帧信息

猜你喜欢

转载自blog.csdn.net/wo8vqj68/article/details/81535812