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

来源:互联网 发布:Java swing黑色主题 编辑:程序博客网 时间:2024/05/06 21:54

执行引擎是Java虚拟机最核心的组成部分之一。执行引擎在执行Java代码的时候可能有解释执行(通过解释器执行)和编译执行(通过即时编译器产生的本地代码执行)两种选择,也可能两者兼备,甚至还可能包含几个不同级别的编译器执行引擎。但从Java虚拟机规范中描述的执行引擎概念模型来说,所有的Java虚拟机的执行引擎都是一样的:它的输入是字节码文件,处理过程是字节码解析的等效过程,输出的是执行结果。

1.运行时栈帧结构

首先,栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构,用于存放一些诸如:

  • 局部变量表

  • 操作数栈

  • 动态连接

  • 方法返回地址

每个方法从调用开始到执行完毕,就对应着一个栈帧在虚拟机栈里面从入栈到出栈的过程。

1.局部变量表

局部变量表当然存储的是方法参数+方法内的变量。而这些数据被存在变量槽(Variable Slot,下称slot)的最小单位中,slot中能存放的类型为:

  • 8种基类类型(bool/byte/char/short/int/long/float/double)

  • reference

  • return Address:指向字节码指令的地址

Java虚拟机规范并没有规定每个slot的大小。所以不同的虚拟机或者操作系统可以有各自的实现。当然,一个slot可以存放一个32位以内的数据类型,包含了上面3类中除long和double的其他类型(64的long和double则分配两个连续slot)

Java虚拟机栈是线程私有的,对线程来说是原子性的

那么JVM如何使用局部变量表的东西呢?答案是索引定位

  • 如果是非static方法,局部变量表的第0号索引的slot默认是当前对象实例的引用对象实例的引用,也就是this指向的对象。

  • slot可以复用,比如函数内变量作用域只在一个循环内,那么后面的变量可以占用这个slot

类变量(非实例变量)的赋值过程:

  • 1.准备阶段,赋予系统初始值(有final的话,在编译时会加上ConstantValue)属性

  • 初始化阶段:是程序员指定的值。实例变量是在使用 new 关键字后,在堆上先进行分配内存的时候获取一次数据类型的零值,然后再执行实例变量定义处的初始化(C++不允许),最后执行的是构造函数的初始化。

0 0