结合实用JVM,图解Java垃圾回收机制的关键技术! ·90张图表+33段代码,轻松理解G1GC算法原理 ·HotSpotVM源码剖析,深探讨G1GC具体实现 1.深Java虚拟机底层原理,详细解读经典GC算法; 2.理论结合实际,基于HotSpotVM源码探讨具体实现; 3.图文并茂、深浅出,辅以大量插图和代码细致讲解。
售 价:¥
纸质售价:¥39.60购买纸书
温馨提示:数字商品不支持退换货,不提供源文件,不支持导出打印
为你推荐
版权声明
前言
注意事项
读者对象
本书中的符号
图中的箭头
伪代码
命名规则
空指针和真假值
函数
缩进
指针
域
for 循环
队列
特殊的函数
并行 GC 和并发 GC
代码中的表示方法
致谢
说明
算法篇
第 1 章 G1GC 是什么
1.1 G1GC 和实时性
1.1.1 实时性
1.1.2 硬实时性和软实时性
1.1.3 可预测性
1.1.4 G1GC 中的实时性
1.1.5 Java 中出现 G1GC 的背景
1.2 堆结构
1.3 执行过程
1.4 并发标记和转移
第 2 章 并发标记
2.1 什么是并发标记
2.2 标记位图
2.3 执行步骤
2.4 步骤①——初始标记阶段
2.5 步骤②——并发标记阶段
2.5.1 SATB
2.5.2 SATB 专用写屏障的优化
2.5.3 SATB 专用写屏障和多线程执行
2.6 步骤③——最终标记阶段
2.7 步骤④——存活对象计数
2.8 步骤⑤——收尾工作
转移效率
2.9 总结
第 3 章 转移
3.1 什么是转移
3.2 转移专用记忆集合
3.2.1 卡表
3.2.2 转移专用记忆集合的构造
3.3 转移专用写屏障
3.4 转移专用记忆集合维护线程
3.5 热卡片
3.6 执行步骤
3.7 步骤①——选择回收集合
3.8 步骤②——根转移
3.8.1 对象转移
3.9 步骤③——转移
3.10 标记信息的作用
3.11 总结
第 4 章 软实时性
4.1 用户的需求
4.2 预测转移时间
4.3 预测可信度
4.4 GC 暂停处理的调度
4.5 并发标记中的暂停处理
第 5 章 分代 G1GC 模式
5.1 不同点
5.2 新生代区域
5.3 分代对象转移
5.4 执行过程简述
5.5 分代选择回收集合
5.6 设置最大新生代区域数
5.7 GC 的切换
5.8 GC 执行的时机
第 6 章 算法篇总结
6.1 关系图
6.2 优点
6.3 缺点
6.4 结束语
实现篇
第 7 章 准备工作
7.1 什么是 HotSpotVM
7.2 什么是 OpenJDK
7.3 获取源码
7.4 代码结构
7.5 两个特殊类
7.5.1 CHeapObj 类
7.5.2 AllStatic 类
7.6 适用于各种操作系统的接口
第 8 章 对象管理功能
8.1 对象管理功能的接口
8.2 对象管理功能的全貌
8.3 CollectedHeap 类
8.3.1 OpenJDK 7 的启动选项和 VM 堆类
8.4 CollectorPolicy 类
8.4.1 启动选项和 CollectorPolicy 类
8.5 各个 GC 类
第 9 章 堆结构
9.1 VM 堆
9.1.1 VM 堆类的初始化
9.2 G1GC 堆
9.2.1 G1CollectedHeap 类
9.2.2 HeapRegion 类
9.2.3 HeapRegionSeq 类
9.3 常驻空间
第 10 章 分配器
10.1 内存分配的流程
10.2 VM 堆的申请
10.3 VM 堆的分配
10.3.1 区域的分配
10.3.2 Windows 上内存空间的申请和分配
10.3.3 Linux 上内存空间的申请和分配
10.3.4 VM 堆中实现对齐的方法
10.4 对象的分配
10.4.1 对象分配的流程
10.4.2 在 G1GC 的 VM 堆中分配内存
10.5 TLAB
第 11 章 对象结构
11.1 oopDesc 类
11.2 klassOopDesc 类
11.3 Klass 类
11.4 类之间的关系
11.5 不要在 oopDesc 类中定义虚函数
11.6 对象头
11.6.1 奇妙的 markOopDesc
11.6.2 前向指针
第 12 章 HotSpotVM 的线程管理
12.1 线程操作的抽象化
12.2 Thread 类
12.3 线程的生命周期
12.3.1 OSThread 类
12.4 Windows 线程的创建
STACK_SIZE_PARAM_IS_A_RESERVATION 标志位
12.5 Windows 线程的处理开始
12.5.1 有效使用缓存行
12.6 Linux 线程的创建
12.6.1 栈的警戒缓存
12.7 开始 Linux 线程的处理
第 13 章 线程的互斥处理
13.1 什么是互斥处理
13.2 互斥量
13.3 监视器
13.3.1 Java 的监视器
13.3.2 Java 监视器与一般监视器的区别
13.4 监视器的实现
13.4.1 线程的暂停与重新启动
13.4.2 监视器的加锁与解锁
13.4.3 监视器的 wait、notify 和 notifyAll 方法
13.5 Monitor 类
13.6 Mutex 类
13.7 MutexLocker 类
第 14 章 GC 线程(并行篇)
14.1 并行执行的流程
14.2 AbstractWorkGang 类
14.3 AbstractGangTask 类
14.4 GangWorker 类
14.5 并行 GC 的执行示例
14.5.1 ①准备工人
14.5.2 ②创建任务
14.5.3 ③并行执行任务
第 15 章 GC 线程(并发篇)
15.1 ConcurrentGCThread 类
15.2 SuspendibleThreadSet 类
15.2.1 集合的操作
15.2.2 线程暂停的时机
15.2.3 从集合外调用 yield()
15.2.4 使用示例
15.3 安全点
15.3.1 什么是安全点
15.3.2 并发 GC 的安全点
15.4 VM 线程
15.4.1 什么是 VM 线程
15.4.2 VM 操作
15.4.3 VM_Operation 类
15.4.4 VM 操作的执行示例
第 16 章 并发标记
16.1 并发标记的全貌
16.1.1 执行步骤
16.1.2 ConcurrentMark 类
16.1.3 ConcurrentMarkThread 类
16.1.4 开始执行并发标记
16.1.5 并发标记的周期
16.2 步骤①——初始标记阶段
16.2.1 根
16.2.2 根扫描的框架
16.2.3 G1GC 的根扫描
16.2.4 根扫描时的标记
16.2.5 位图的并行化方法
16.3 步骤②——并发标记阶段
16.4 步骤③——最终标记阶段
16.5 步骤④——存活对象计数
16.6 步骤⑤——收尾工作
第 17 章 转移
17.1 转移的全貌
17.1.1 执行步骤
17.1.2 转移执行的时机
17.1.3 do_collection_pause_at_safepoint()
17.1.4 转移专用记忆集合维护线程
17.2 步骤①——选择回收集合
17.2.1 选择新生代区域
17.2.2 选择老年代区域
17.3 步骤②——根转移
17.3.1 evacuate_collection_set()
17.3.2 对象转移
17.3.3 复制函数
17.4 步骤③——转移
第 18 章 预测与调度
18.1 根据历史记录进行预测
18.1.1 均值、方差和标准差
18.1.2 衰减均值
18.1.3 衰减方差
18.1.4 包含偏差的预测
18.1.5 历史记录的实现
18.1.6 获取预测值
18.2 并发标记的调度
18.3 转移的调度
第 19 章 准确式 GC 的实现
19.1 栈图
19.1.1 基本类型和引用类型的变量
19.1.2 HotSpotVM 的栈
19.1.3 HotSpotVM 的执行流程
19.1.4 什么是栈图
19.1.5 抽象解释器
19.1.6 栈图的创建
19.1.7 有条件分支时的栈图
19.1.8 方法调用时的栈图
19.1.9 已编译的栈帧
19.2 句柄区域与句柄标记
第 20 章 写屏障的性能开销
20.1 运行时切换 GC 算法
20.1.1 性能下降的担忧
20.1.2 写屏障的性能开销增加
20.2 解释器的写屏障
20.2.1 写屏障的切换
20.2.2 在 G1GC 加入前,写屏障只有一种
20.3 JIT 编译器的写屏障
20.3.1 C1 编译器
20.3.2 生成写屏障的机器代码
后记
写在算法篇完成之后
写在实现篇完成之后
致想要深入研究 GC 的读者
参考文献
作者简介
看完了
买过这本书的人还买过
读了这本书的人还在读
同类图书排行榜