Jvm系列5—执行子系统

Posted by Gityuan on October 26, 2015

字节码执行引擎

概述

执行引擎是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 | 博客 留言区交流