描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787111645245
《深入浅出:Java虚拟机设计与实现》不仅关注对技术本身的介绍,还重点强调了这些技术所涉及的知识对读者进一步掌握工具和提高软件设计水平的重要作用,并给出了丰富的示例和*佳实践。
《深入浅出:Java虚拟机设计与实现》适合 Java 程序员、对编译器和虚拟机底层技术感兴趣的工程人员,以及高等院校计算机相关专业的学生阅读。
第 1 章 虚拟机架构 /1
1.1 Java 与 Java 虚拟机 /1
1.1.1 设计背景 /1
1.1.2 Java 技术栈的组成要素 /2
1.1.3 Java 字节码 /3
1.2 Java 虚拟机架构 /5
1.3 实例:J 语言及其编译 /7
1.3.1 J 语言语法 /7
1.3.2 栈式计算机 /13
1.3.3 J 字节码 /17
1.3.4 J 语言编译到 J 字节码 /19
1.4 实例:J 虚拟机 /23
1.4.1 字节码加载子系统 /23
1.4.2 字节码验证器 /24
1.4.3 解释执行引擎 /27
第 2 章 类加载器 /30
2.1 实例:Java 的类加载 /30
2.2 类的二进制定义 /32
2.2.1 常量池 /34
2.2.2 接口 /36
2.2.3 字段 /37
2.2.4 方法 /37
2.2.5 属性 /38
2.3 方法区 /41
2.3.1 代码区 /41
2.3.2 运行时常量池 /45
2.3.3 类辅助数据结构 /47
2.4 类装载 /49
2.4.1 递归下降装载 /50
2.4.2 接口的装载 /57
2.4.3 数组的装载 /57
2.4.4 基本类的装载 /59
2.5 验证 /61
2.5.1 为什么要进行验证 /61
2.5.2 验证的目标 /63
2.5.3 实例:验证规则 /63
2.5.4 结构化约束 /68
2.5.5 类型推导 /69
2.6 准备 /75
2.6.1 静态字段的准备 /76
2.6.2 非静态字段的准备 /77
2.6.3 虚方法表 /80
2.7 解析 /86
2.7.1 实例:类的解析 /86
2.7.2 类的解析 /88
2.7.3 字段的解析 /89
2.7.4 方法的解析 /91
2.7.5 接口方法的解析 /98
2.7.6 字符串常量的解析 /100
2.7.7 常量池其他表项的解析 /101
2.8 初始化 /101
2.8.1 类初始化方法 /102
2.8.2 类初始化算法 /103
2.9 类加载各阶段的执行顺序 /110
2.9.1 急切策略和惰性策略 /111
2.9.2 类解析和类初始化的耦合性 /113
2.10 自定义类加载器 /114
2.10.1 独立加载模型 /116
2.10.2 双亲委派模型 /118
2.11 实例:类加载器的典型应用 /123
2.11.1 动态代理 /124
2.11.2 热替换 /133
第 3 章 执行引擎 /139
3.1 栈帧结构 /139
3.2 调用规范 /140
3.3 执行引擎架构 /141
3.3.1 序列式架构 /142
3.3.2 跳转表架构 /143
3.4 执行引擎实现 /145
3.4.1 常量加载指令 /145
3.4.2 数据加载指令 /147
3.4.3 数据存储指令 /149
3.4.4 栈操作指令 /151
3.4.5 数学运算指令 /152
3.4.6 数值转换指令 /155
3.4.7 比较运算指令 /157
3.4.8 控制转移指令 /159
3.4.9 引用指令 /176
3.4.10 扩展与虚拟机保留指令 /185
3.5 本地方法执行引擎 /187
3.6 可重入方法 /194
3.7 汇编模板 /198
第 4 章 本地方法接口 /201
4.1 实例:Java 本地方法 /201
4.2 方法绑定 /202
4.2.1 本地方法的数据结构 /203
4.2.2 动态库加载 /205
4.2.3 动态绑定 /206
4.2.4 静态绑定 /209
4.3 本地方法拦截 /213
4.3.1 拦截机制 /213
4.3.2 耦合性 /216
4.3.3 反射 /217
4.4 本地方法回调 Java 方法 /218
4.4.1 JNI 回调函数 /220
4.4.2 本地方法栈帧 /223
第 5 章 异常处理 /226
5.1 实例:Java 异常处理 /226
5.2 异常栈 /228
5.3 异常表 /236
5.4 栈回滚 /243
5.5 本地方法异常 /247
5.6 其他问题 /250
5.6.1 隐式异常 /250
5.6.2 异常处理与多线程 /253
5.6.3 执行效率 /254
第 6 章 堆和垃圾收集 /255
6.1 实例:对象与垃圾 /255
6.1.1 语法垃圾与语义垃圾 /256
6.1.2 内存泄漏 /257
6.2 堆 /258
6.2.1 堆数据结构 /258
6.2.2 堆分配接口 /259
6.3 存储布局 /259
6.3.1 对象的存储布局 /259
6.3.2 类的存储布局 /263
6.3.3 数组的存储布局 /264
6.4 垃圾收集 /265
6.4.1 根节点 /266
6.4.2 复制收集 /270
6.4.3 终结 /276
6.4.4 垃圾收集的触发 /280
6.5 本地方法和垃圾收集 /281
6.5.1 局部和全局引用 /281
6.5.2 对象引用相关 JNI 函数的实现 /283
6.6 其他问题 /285
6.6.1 多线程与垃圾收集 /285
6.6.2 无中断垃圾收集 /289
6.6.3 类型标记 /291
第 7 章 多线程 /293
7.1 线程语义模型 /293
7.1.1 线程方法 /293
7.1.2 线程状态 /294
7.1.3 实例:线程中断 /297
7.2 管程 /303
7.2.1 管程数据结构 /303
7.2.2 接口与实现 /307
7.2.3 管程指令 /314
7.2.4 管程与对象 /316
7.3 多线程的实现 /318
7.3.1 线程数据结构 /319
7.3.2 创建线程对象 /321
7.3.3 启动 /323
7.3.4 让出 /325
7.3.5 睡眠 /325
7.3.6 中断 /327
7.3.7 停止、挂起和继续 /335
7.3.8 原子性和可见性 /337
7.3.9 线程与信号 /338
7.4 多线程与虚拟机其他子系统的交互 /342
7.4.1 全局数据结构与锁 /343
7.4.2 类初始化 /345
7.4.3 垃圾收集 /350
第 8 章 调试 /357
8.1 调试器架构 /357
8.1.1 客户端{服务器架构 /358
8.1.2 JDWP 调试协议 /359
8.1.3 数据类型 /360
8.1.4 实例:断点 /361
8.2 调试代理 /364
8.2.1 通信模块 /365
8.2.2 执行引擎模块 /366
8.2.3 对象管理模块 /370
8.2.4 事件处理模块 /371
8.3 实例:jdb 调试器 /376
8.4 调试的其他问题 /384
8.4.1 薛定谔困境 /384
一。许多通用性和领域性程序设计语言都使用某种与体系结构无关的中间语言格
式作为编译目标,该中间语言在虚拟机上运行,因此虚拟机设计和实现就成为了支
撑这类语言构建软件系统的关键与基础,而深入理解和掌握虚拟机设计和实现的
基本原理和技术,也成为程序员必备的重要知识和技能。
但是,虚拟机的设计与实现所涉及的知识体系广而繁杂,和计算机科学的许多
学科分支,如算法设计分析、程序设计语言、编译器、体系结构等,都有密切联系,
并且,现代虚拟机已经发展得非常复杂,其中包含很多编程技巧和各种优化方法。
虚拟机设计和实现的这些特点给初学者带来了很多困难:一方面,以小型的教学虚
拟机入手研究,难以看到虚拟机设计与实现的全貌;另一方面,研究和学习工业级
的虚拟机实现,又容易陷入繁复的实现细节。
本书讨论了一个典型 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 调试在可调试性和安全性方面的
问题。
限于篇幅并考虑读者的学习需求,本书略去了某些虚拟机实现技术,读者可以
在其他著作中进一步学习。
本书是笔者在中国科学技术大学软件学院讲授的相关课程等资料基础上精心
总结而成的,在此感谢中国科学技术大学相关老师和同学对课程的支持与建议。
由于作者水平和时间有限,错漏之处在所难免,敬请批评指正。
华保健
于中国科学技术大学软件学院
评论
还没有评论。