background image

刚才已经提到,JVM 可以由不同的厂商来实现。由于厂商的不同必然导致 JVM 在实

现上的一些不同,然而 JVM 还是可以实现跨平台的特性,这就要归功于设计 JVM 时的体
系结构了。

我们知道,一个 JVM 实例的行为不光是它自己的事,还涉及到它的子系统、存储区

域、数据类型和指令这些部分,它们描述了 JVM 的一个抽象的内部体系结构,其目的不
光规定实现 JVM 时它内部的体系结构,更重要的是提供了一种方式,用于严格定义实现
时的外部行为。每个 JVM 都有两种机制,一个是装载具有合适名称的类(类或是接口),
叫做类装载子系统;另外的一个负责执行包含在已装载的类或接口中的指令,叫做运行
引擎。每个 JVM 又包括方法区、堆、Java 栈、程序计数器和本地方法栈这五个部分,这
几个部分和类装载机制与运行引擎机制一起组成的体系结构图为:

图 3  JVM 的体系结构

JVM 的每个实例都有一个它自己的方法域和一个堆,运行于 JVM 内的所有的线程都

共享这些区域;当虚拟机装载类文件的时候,它解析其中的二进制数据所包含的类信息,
并把它们放到方法域中;当程序运行的时候,JVM 把程序初始化的所有对象置于堆上;
而每个线程创建的时候,都会拥有自己的程序计数器和 Java 栈,其中程序计数器中的值
指向下一条即将被执行的指令,线程的 Java 栈则存储为该线程调用 Java 方法的状态;
本地方法调用的状态被存储在本地方法栈,该方法栈依赖于具体的实现。

下面分别对这几个部分进行说明。

执行引擎处于 JVM 的核心位置,在 Java 虚拟机规范中,它的行为是由指令集所决定

的。尽管对于每条指令,规范很详细地说明了当 JVM 执行字节码遇到指令时,它的实现
应该做什么,但对于怎么做却言之甚少。Java 虚拟机支持大约 248 个字节码。每个字节