深入浅出Java虚拟机设计与实现

©2020 by 华保健
机械工业出版社
ISBN:9787111645245
XI + 388页

前 言

虚拟机设计与实现是计算机科学中最古老、最成熟,也是应用最广泛的课题之
一。许多通用性和领域性程序设计语言都使用某种与体系结构无关的中间语言格
式作为编译目标,该中间语言在虚拟机上运行,因此虚拟机设计和实现就成为了支
撑这类语言构建软件系统的关键与基础,而深入理解和掌握虚拟机设计和实现的
基本原理和技术,也成为程序员必备的重要知识和技能。

但是,虚拟机的设计与实现所涉及的知识体系广而繁杂,和计算机科学的许多
学科分支,如算法设计分析、程序设计语言、编译器、体系结构等,都有密切联系,
并且,现代虚拟机已经发展得非常复杂,其中包含很多编程技巧和各种优化方法。
虚拟机设计和实现的这些特点给初学者带来了很多困难:一方面,以小型的教学虚
拟机入手研究,难以看到虚拟机设计与实现的全貌;另一方面,研究和学习工业级
的虚拟机实现,又容易陷入繁复的实现细节。

本书讨论了一个典型 Java 虚拟机的设计原理和实现技术,其内容编排遵循了
以下几个原则。第一个原则是完整性。初学者在学习虚拟机设计与实现技术时,遇到的最大困
难是在设计和实现一个虚拟机的过程中遇到问题的多样性,其中包括但不限于字
节码文件格式、编译、动态加载和链接、执行引擎、堆和垃圾收集、本地方法接口、
多线程与锁等广泛的内容。因此,若不能对这些相关技术进行全面介绍,读者就很
难了解到虚拟机实现的全过程。基于此,本书完整地介绍了 Java6(JVMS2) 的实现
过程,讨论了其中每个特性的实现原理和技术。

第二个原则是实践性。本书除了讨论虚拟机设计的基本原理和方法,还介绍了
虚拟机的实现技术,对讨论的每个数据结构和算法都给出了类 C 语言的伪代码实
现描述,这样,读者不仅能够深入理解虚拟机实现的基本原理,还能基于这些算法
实现自己的虚拟机。

第三个原则是应用性,即本书特别强调了虚拟机设计和实现相关的理论和技
术对 Java 程序设计的指导作用。为此,书中结合对虚拟机实现技术的讨论,给出
了较多的 Java 代码实例。一方面,通过对这些具体 Java 代码实例的讨论,读者可
以更深入地理解虚拟机的运行原理;另一方面,理解虚拟机的设计与实现原理也有
助于程序员构造更高质量的 Java 软件系统。笔者相信,虽然只有少量程序员会专
门从事虚拟机的研究和开发工作,但理解包括虚拟机在内的底层系统的工作机理,
是当前程序员知识栈中不可或缺的重要部分。

本书分为 8 章,第 1 章介绍 Java 虚拟机的整体架构。本章还讨论了一个简单
的源语言——J 语言,其中包括对 J 语言语法、栈式计算机、J 字节码等方面的讲
解,阐述了该源语言的程序从编译、加载到解释执行的整个过程,让读者对高级语
言编译、字节码虚拟指令集、解释执行等虚拟机里的重要概念有一个全局的了解,
也为后续章节中对 Java 虚拟机的深入讨论奠定基础。

第 2 章讨论了虚拟机类加载器的实现,主要内容有类的二进制定义、虚拟机
方法区的设计,以及类加载的过程,包括类装载算法、类的验证、类的准备、类的
解析、类的初始化和这些阶段的执行顺序。最后,本章还讨论了自定义类加载器的
实现技术,并给出了自定义类加载器的两个典型应用:动态代理和热替换。

第 3 章讨论了执行引擎的设计与实现。主要内容包括:Java 运行栈的组织与
数据结构设计、Java 方法调用规范与参数传递、Java 字节码执行引擎等。本章还
简要讨论了本地方法执行引擎和可重入函数,以及一种常用的执行引擎实现加速
技术——汇编模板。

第 4 章讨论了本地方法接口的实现技术。本章首先介绍了 Java 提供的标准本
地方法接口 (Java Native Interface,JNI),用于支持 Java 代码和本地代码的相互
调用,然后讨论了二进制文件的加载、方法的静态注册和动态注册、本地方法的拦
截,以及本地方法回调 Java 方法的技术。

第 5 章讨论了异常处理的实现方法和技术。本章首先给出了异常处理的两种
最常用的实现技术||异常栈和异常表,讨论了这两种实现方式的优缺点,然后重
点讨论了 Java 中使用的基于异常表的异常处理实现技术,包括异常表数据结构、
栈回滚、本地方法异常等,最后讨论了异常处理中的一些其他重要问题,包括隐式
异常、异常处理与多线程,以及异常的运行效率。

第 6 章讨论了堆和垃圾收集。Java 不支持动态内存的手工回收,而必须使用
自动机制。本章讨论了 Java 堆数据结构、堆分配接口、对象的存储布局,并重点
讲解了基于 Cheney 算法的复制收集算法,另外,也介绍了和 Java 程序密切相关
的根节点标记算法、终结和垃圾收集的触发机制。本章还讨论了对 Java 程序进行
垃圾收集的一些关键问题,包括本地方法和垃圾收集、多线程与垃圾收集、无中断
垃圾收集和类型标记等。

第 7 章讨论了多线程的实现技术。本章的主要内容有三个方面:第一,Java 多
线程的语义模型,包括线程库中的主要线程方法、线程状态及线程中断;第二,管
程的实现,包括管程数据结构、管程操作的接口与实现、管程与对象等;第三,多
线程的实现,包括线程数据结构、创建线程对象、线程操作接口的支持等。本章还
讨论了多线程与虚拟机其他子系统之间的交互。

第 8 章讨论了 Java 调试技术及其实现。本章内容包括 Java 调试器的整体架
构、虚拟机端调试代理的设计与实现,以及 Java 调试在可调试性和安全性方面的问题。

限于篇幅并考虑读者的学习需求,本书略去了某些虚拟机实现技术,读者可以
在其他著作中进一步学习。

本书是笔者在中国科学技术大学软件学院讲授的相关课程等资料基础上精心
总结而成的,在此感谢中国科学技术大学相关老师和同学对课程的支持与建议。
由于作者水平和时间有限,错漏之处在所难免,敬请批评指正。


华保健
于中国科学技术大学软件学院