background image

那么到底什么是 Java 虚拟机(JVM)呢?通常我们谈论 JVM 时,我们的意思可能是:

1.

对 JVM 规范的的比较抽象的说明;

2.

对 JVM 的具体实现;

3.

在程序运行期间所生成的一个 JVM 实例。

对 JVM 规范的的抽象说明是一些概念的集合,它们已经在书《The Java Virtual Machine 
Specification》(《Java 虚拟机规范》)中被详细地描述了;对 JVM 的具体实现要么是软件,要么是

 

软件和硬件的组合,它已经被许多生产厂 商所实现,并存在于多种平台之上;运行 Java 程序的任务由
JVM 的运行期实例单个承担。在本文中我们所讨论的 Java 虚拟机(JVM)

 

主要针对第三种情 况而言。它

可以被看成一个想象中的机器,在实际的计算机上通过软件模拟来实现,有自己想象中的硬件,如处理
器、堆栈、寄存器等,还有自己相应的指令系统。
JVM 在它的生存周期中有一个明确的任务,那就是运行 Java 程序,因此当 Java 程序启动的时候,就产
生 JVM 的一个实例;当程序运行结束的时候,该实例也跟着消失了。下面我们从 JVM 的体系结构和它
的运行过程这两个方面来对它进行比较深入的研究。
2   Java 虚拟机的体系结构
刚才已经提到,JVM 可以由不同的厂商来实现。由于厂商的不同必然导致 JVM 在实现上的一些不同,
然而 JVM 还是可以实现跨平台的特性,这就要归功于设计 JVM 时的体系结构了。
我们知道,一个 JVM 实例的行为
光是它自己的事,还涉及到它的子系统、存储区域、数据类型和指令这些部分,它们描述了 JVM 的一

 

个抽象的内部体系 结构,其目的不光规定实现 JVM 时它内部的体系结构,更重要的是提供了一种方式,
用于严格定义实现时的外部行为。每个 JVM

 

都有两种机制,一个是装载具有 合适名称的类(类或是接

口),叫做类装载子系统;另外的一个负责执行包含在已装载的类或接口中的指令,叫做运行引擎。每
个 JVM

 

又包括方法区、堆、 Java 栈、程序计数器和本地方法栈这五个部分,这几个部分和类装载机制

与运行引擎机制一起组成的体系结构图为:

图 3   JVM 的体系结构

JVM 的每个实例都有一个它自己的方法域和一个堆,运行于 JVM 内的所有的线程都共享这些区域;当

 

虚拟机装载类文件的时候,它解析其中的二进制数据 所包含的类信息,并把它们放到方法域中;当程
序运行的时候,JVM 把程序初始化的所有对象置于堆上;而每个线程创建的时候,都会拥有自己的程序

 

计数器和 Java 栈,其中程序计数器中的值指向下一条即将被执行的指令,线程的 Java 栈则存储为该线
程调用 Java

 

方法的状态;本地方法调用的状态被存储在本地 方法栈,该方法栈依赖于具体的实现。

下面分别对这几个部分进行说明。
执行引擎处于 JVM 的核心位置,在 Java 虚拟机规范中,它的行为是由指令集所决定的。尽管对于每条
指令,规范很详细地说明了当 JVM

 

执行字节码遇 到指令时,它的实现应该做什么,但对于怎么做却言