Java虚拟机架构

Java虚拟机规范中规定了虚拟机必须遵守一些规则,只要符合这些规范,其实现可以完全不同。例如有Oracle官方的Hotspot,IBM的Jikes,Google的安卓虚拟机。这些虚拟机有各自的架构,本文以Hotspot为例介绍虚拟机各个组成部分。


整体架构:

典型的虚拟机架构如下图所示:

Java虚拟机架构

主要组件包括:类加载子系统、含有垃圾回收的内存系统、仿真引擎(或者成为执行引擎)


各部分简介

1. 类加载子系统(Class Loaders)

类加载器把含有元数据和指令的类文件(.class,可以是存储在本地的文件,也可以来自网络的二进制流)转化为一个依赖于实现的内存映像。具体步骤大致如下:
首先将二进制类载入内存,接着执行一些一致性检查,例如魔数,版本号等等Class文件中的内容。在程序被验证为正确结构之后,解析指令并初始化内存(此内存模型符合虚拟机的具体实现),初始化之后将控制传给执行引擎。

2. 内存和状态寄存器

内存由一个程序代码区(方法区)、一个全局内存区(堆)、一个结构化的Java栈、一个本地方法栈组成。
方法区是线程共享的内存区域,用于存放类信息、常量、静态变量、即时编译后的代码等等。
堆用于存放程序创建的所有对象和数组,线程共享。这是回收期工作的主要对象。
Java栈为线程私有,存储局部变量、操作数栈、动态链接、方法出口等等。
本地方法栈则是为虚拟机调用本地方法服务的。

与内存相关的两个重要寄存器是PCs和栈指针。其中,程序计数器指向下一条要执行的指令(存放于方法区中),只能通过PCs来访问程序内存。栈指针指向Java栈的栈顶,用来访问栈中的内容。

3. 垃圾回收器(Garbage Collector)

当程序不再需要使用Java对象时,这些对象就成为了垃圾。虽然虚拟机规范中对于栈大小没有明确规定,但是实际的虚拟机实现内存都是有限的,因此必须回收垃圾以便可以重新使用内存。垃圾回收器就是负责找出不需要的对象,将其回收。

4. 执行引擎

仿真引擎有本地方法接口和寄存器支持,负责仿真Java字节码指令,可以是简单的解释器,也可以是编译器编译成主机指令。也可以将两者结合来实现高性能虚拟机,检查到热点之后翻译成本地指令保存在代码cache中。

5. 本地方法接口

虚拟机使用一组标准库来访问由操作系统管理的(operating system-managed)功能。例如,利用这些库执行文件I/O等等。这些标准可有些事用Java写的,有些则使用本地代码(如C),许多对操作系统的调用是通过本地方法来完成的。在JDK中可以找到这一些本地代码。

说明:

虚拟机的内容非常繁多而且复杂,这些文章都比较零散,等对虚拟机掌握得比较透彻之后,再总结一些比较系统的知识。