<p>本书深入Java虚拟机底层原理,对JVM内存管理中的垃圾回收算法G1GC进行了详细解读。全书分为“算法篇”和“实现篇”两大部分:前一部分主要介绍G1GC的算法原理,内容包括G1GC的并发标记、转移功能、软实时性的实现和分代G1GC模式;后一部分聚焦算法篇中没有详细讲解的实现部分,基于HotSpotVM源码,讲解对象管理功能、内存分配器的机制、线程管理方法和G1GC的具体实现。</p> <p>本书以图配文,通俗易懂,既系统介绍了G1GC的基础算法,又贴近现实,剖析了实用JVM中的G1GC实现,同时还包含了作者对G1GC的研究成果和独到见解,是深入理解JVM和G1GC机制的佳作。</p>
虚拟机设计与实现--以JVM为例
✍ Scribed by 李晓峰
- Publisher
- 人民邮电出版社
- Year
- 2020-1
- Tongue
- Chinese
- Leaves
- 382
- Series
- 图灵程序设计丛书·Java系列
- Category
- Library
No coin nor oath required. For personal study only.
✦ Synopsis
本书从一位虚拟机(VM)架构师的角度,以易于理解、层层深入的方式介绍了各种主题和算法,尤其是不同VM通用的主要技术。这些算法用图示充分解释,用便于理解的代码片段实现,使得这些抽象概念对系统软件工程师而言具像化并可编程。书中还包括一些同类文献中较少涉及的主题,例如运行时辅助、栈展开和本地接口。本书集理论性与实践性于一身,不仅结合了高层设计功能与底层实现,而且还结合了高级主题与商业解决方案,是VM设计和工程实践方面的理想参考读物。
✦ Table of Contents
第一部分 虚拟机基础
第1章 虚拟机简介
1.1 虚拟机类型
1.2 为什么需要虚拟机
1.3 虚拟机示例
1.3.1 JavaScript引擎
1.3.2 Perl引擎
1.3.3 Android Java VM
1.3.4 Apache Harmony
第2章 虚拟机内部组成
2.1 虚拟机核心组件
2.1.1 加载器与动态链接器
2.1.2 执行引擎
2.1.3 内存管理器
2.1.4 线程调度器
2.1.5 语言扩展
2.1.6 传统模型与虚拟机模型
2.2 虚拟ISA
2.2.1 JVM
2.2.2 JVM与CLR
第3章 虚拟机中的数据结构
3.1 对象与类
3.2 对象表示
3.3 方法描述
第二部分 虚拟机设计
第4章 执行引擎设计
4.1 解释器
4.1.1 超级指令
4.1.2 选择性内联
4.2 JIT编译
4.2.1 基于方法的JIT
4.2.2 基于踪迹的JIT
4.2.3 基于区域的JIT
4.3 解释器与JIT编译器的关系
4.4 AOT编译
4.5 编译时与运行时
第5章 垃圾回收设计
5.1 对象生存期
5.2 引用计数
5.3 对象追踪
5.4 RC与对象追踪
5.5 GC安全点
5.6 常用追踪GC算法
5.6.1 标记清除
5.6.2 追踪复制
5.7 常用追踪GC变体
5.7.1 标记压缩
5.7.2 滑动压缩
5.7.3 追踪转发
5.7.4 标记复制
5.7.5 分代式GC
5.8 移动式GC与非移动式GC
5.8.1 数据局部性
5.8.2 跳增指针分配
5.8.3 空闲列表与分配位图
5.8.4 离散大小列表
5.8.5 标记位与分配位
5.8.6 线程局部分配
5.8.7 移动式GC与非移动式GC的混合
第6章 线程设计
6.1 什么是线程
6.2 内核线程与用户线程
6.3 VM线程到OS线程的映射
6.4 同步构件
6.5 monitor
6.5.1 互斥
6.5.2 条件变量
6.5.3 monitorenter
6.5.4 monitorexit
6.5.5 Object.wait()
6.5.6 Object.notify()
6.6 原子
6.7 monitor与原子
6.7.1 阻塞与非阻塞
6.7.2 中央控制点
6.7.3 锁与非锁
6.7.4 非阻塞之上的阻塞
6.8 回收器与修改器
6.9 线程局部数据
6.10 GC的线程暂停支持
6.10.1 GC安全点
6.10.2 GC安全区域
6.10.3 基于锁的安全点
6.10.4 回收中的线程交互
第三部分 虚拟机内部支持
第7章 本地接口
7.1 为何需要本地接口
7.2 从托管代码到本地代码的转换
7.2.1 本地方法封装
7.2.2 封装代码的GC支持
7.2.3 封装代码的同步支持
7.3 本地方法实现的绑定
7.4 本地代码到托管代码的转换
7.5 本地代码到本地代码的转换
7.5.1 通过JNI API的本地到本地转换
7.5.2 为什么在本地到本地转换中使用JNI API
第8章 栈展开
8.1 为何需要栈展开
8.2 Java方法帧的栈展开
8.2.1 栈展开设计
8.2.2 栈展开实现
8.3 本地方法帧的栈展开
8.3.1 栈展开设计
8.3.2 Java到本地封装设计
8.3.3 栈展开实现
8.3.4 本地帧与C帧
第9章 垃圾回收支持
9.1 为何需要垃圾回收支持
9.2 在Java代码中支持垃圾回收
9.2.1 GC-map
9.2.2 带寄存器的栈展开
9.3 在本地代码中支持垃圾回收
9.3.1 对象引用访问
9.3.2 对象句柄实现
9.3.3 GC安全性维护
9.3.4 对象体访问
9.3.5 对象分配
9.4 在同步方法中支持垃圾回收
9.4.1 同步Java方法
9.4.2 同步本地方法
9.5 Java与本地代码转换中的GC支持
9.5.1 本地到Java
9.5.2 Java到本地
9.5.3 本地到本地
9.6 全局根集
第10章 运行时辅助
10.1 为何需要运行时辅助
10.2 带运行时辅助的VM服务设计
10.2.1 运行时辅助操作
10.2.2 运行时辅助实现
10.2.3 JNI API作为运行时辅助
10.3 没有运行时辅助的VM服务设计
10.3.1 运行时辅助的快速路径
10.3.2 快速路径VM服务编程
10.4 主要VM服务
第11章 异常抛出
11.1 保存异常抛出上下文
11.1.1 VM保存的上下文
11.1.2 Linux中OS保存的上下文
11.1.3 Windows中OS保存的上下文
11.1.4 同步与异步异常
11.2 本地代码内与跨本地代码异常处理
11.2.1 本地代码内的异常处理
11.2.2 带异常Java代码返回到本地代码
11.2.3 带异常的本地代码返回到Java代码
11.3 保存栈轨迹
11.4 找到异常处理器
11.5 控制转移
11.5.1 控制转移操作
11.5.2 用于控制转移的寄存器
11.5.3 数据寄存器恢复
11.5.4 控制寄存器修正
11.5.5 执行恢复
11.5.6 未捕获异常
第12章 终结与弱引用
12.1 终结
12.2 为何需要弱引用
12.3 对象生存期状态
12.3.1 对象状态转换
12.3.2 引用队列
12.3.3 引用对象状态转换
12.4 引用对象实现
12.5 引用对象处理顺序
第13章 虚拟机模块化设计
13.1 VM组件
13.2 对象信息暴露
13.3 垃圾回收器接口
13.4 执行引擎接口
13.5 跨组件优化
第四部分 垃圾回收优化
第14章 针对吞吐量的GC优化
14.1 部分堆回收与全堆回收之间的适应性调整
14.2 分代式与非分代式算法之间的适应性调整
14.3 堆的空间大小的适应性调整
14.3.1 空间大小扩展
14.3.2 NOS大小
14.3.3 部分转发NOS设计
14.3.4 半空间NOS设计
14.3.5 aged-mature NOS设计
14.3.6 回退回收
14.4 分配空间之间的适应性调整
14.5 大OS页与预取
第15章 针对可扩展性的GC优化
15.1 回收阶段
15.2 并行对象图遍历
15.2.1 任务共享
15.2.2 工作偷取
15.2.3 任务推送
15.3 并行对象标记
15.4 并行压缩
15.4.1 并行LISP2压缩器
15.4.2 对象依赖树
15.4.3 带用于转发指针的目标表的压缩器
15.4.4 基于对象节的压缩器
15.4.5 单趟就地压缩器
第16章 针对响应性的GC优化
16.1 区域式GC
16.2 并发追踪
16.2.1 起始快照
16.2.2 增量更新
16.2.3 用三色术语表示并发追踪
16.2.4 使用读屏障的并发追踪
16.3 并发根集枚举
16.3.1 并发根集枚举设计
16.3.2 在根集枚举过程中追踪堆
16.3.3 并发栈扫描
16.4 并发回收调度
16.4.1 调度并发根集枚举
16.4.2 调度并发堆追踪
16.4.3 并发回收调度
16.4.4 并发回收阶段转换
第17章 并发移动式回收
17.1 并发复制:“目标空间不变”
17.1.1 基于槽位的“目标空间不变”算法
17.1.2 “目标空间不变”性
17.1.3 对象转发
17.1.4 基于对象的“目标空间不变”算法
17.1.5 基于虚拟内存的“目标空间不变”算法
17.2 并发复制:“当前副本不变”
17.2.1 对象移动风暴
17.2.2 “当前副本不变”设计
17.2.3 并发复制与并发堆追踪的关系
17.3 并发复制:“源空间不变”
17.3.1 “源空间不变”设计
17.3.2 部分转发“源空间不变”设计
17.4 无STW的完整并发移动
17.5 并发压缩回收
17.5.1 并发区域复制式回收
17.5.2 基于虚拟内存的并发压缩
第五部分 线程交互优化
第18章 monitor性能优化
18.1 惰性锁
18.2 瘦锁
18.2.1 瘦锁锁定路径
18.2.2 瘦锁解锁路径
18.2.3 竞争标志重置支持
18.3 胖锁
18.3.1 整合monitor数据结构
18.3.2 交由OS来支持
18.3.3 瘦锁膨胀为胖锁
18.3.4 休眠等待被竞争瘦锁
18.4 Tasuki锁
18.4.1 将同一个胖锁monitor用于竞争控制
18.4.2 胖锁收缩为瘦锁
18.5 线程局部锁
18.5.1 锁保留
18.5.2 线程亲密锁
第19章 基于硬件事务内存的设计
19.1 硬件事务内存
19.1.1 从事务数据库到事务内存
19.1.2 Intel的HTM实现
19.2 使用HTM的monitor实现
19.2.1 基于HTM的monitor的正确性问题
19.2.2 基于HTM的monitor的性能问题
19.3 使用HTM的并发垃圾回收
19.3.1 GC中HTM的机会
19.3.2 复制式回收
19.3.3 压缩式回收
参考文献
📜 SIMILAR VOLUMES
<p>本书首先介绍了Lua中的数据结构,比如通用数据是如何表示的、Lua的字符串以及表类型的实现原理,接着讨论了Lua虚拟机的实现,并且将其中重点的一些指令进行了分类讲解,最后讨论了垃圾回收、模块实现、热更新、协程等的实现原理。</p>