字节码执行引擎
概述
执行引擎是Java虚拟机非常最核心的部分,对于物理级的执行引擎是直接建立在处理器、硬件、指令集合操作系统层面,而虚拟机执行引擎则是由自行定制的指令集与执行引擎的结构体系。执行引擎在执行Java会有解释执行(通过解释器)和编译执行(通过JIT生成的本地代码)两种选择,对于Android ART又多了一种提前编译器(AOT)。
接下来,主要讲解虚拟机的方法执行过程,对于Java虚拟机的解释器的执行模型(不考虑异常处理):
do {
atomically calculate pc and fetch opcode at pc;
if (operands) fetch operands;
execute the action for the opcode;
} while (there is more to do);
在Jvm系列1—运行时内存模型,有提到栈帧(Stack Frame),这是用于支持虚拟机的方法调用和方法执行的重要数据结构。每一个方法的调用到执行完成,都对着栈帧的入栈和出栈过程。
对象创建
Java作为一门面向对象的语言,对象的创建时刻都在发生着,对于Java语言来说创建对象只需要一个new关键字就可以完成,接下来看看从Java虚拟机角度创建对象是怎样的一个过程。如下代码:
Person person = new Person();
当虚拟机遇到new指令后,执行如下流程:
- 先检查指令参数“Person”能否在常量池中定位到Person类的符号引用;如果找到,则往下执行;
- 再检查Person类是否已经加载、解析和初始化;如果没有初始化,则先执行类加载过程;
- 类加载后,虚拟机为新生成的person对象在堆上分配相应大小的内存;(对象大小在类加载后确定)
- 内存分配后,虚拟机将分配的内存空间都初始化为零值(不包括对象头),实例变量不赋初值也能使用对应的零值;
- 设置对象头信息,比如对象的哈希值,gc分代年龄等。
从虚拟机角度,到此一个新的对象已经创建完成。但从Java视角,对象才刚刚开始,init构造方法还没有执行,所有字段还是零。执行完init方法,按java程序的构造方法进行初始化后,对象便是彻底创建完成。
未完,待续
微信公众号 Gityuan | 微博 weibo.com/gityuan | 博客 留言区交流