内容简介
第1章 引言
1.1 显式内存释放
1.2 自动动态内存管理
1.3 垃圾回收算法之间的比较
1.3.1 安全性
1.3.2 吞吐量
1.3.3 完整性与及时性
1.3.4 停顿时间
1.3.5 空间开销
1.3.6 针对特定语言的优化
1.3.7 可扩展性与可移植性
1.4 性能上的劣势
1.5 实验方法
1.6 术语和符号
1.6.1 堆
1.6.2 赋值器与回收器
1.6.3 赋值器根
1.6.4 引用、域和地址
1.6.5 存活性、正确性以及可达性
1.6.6 伪代码
1.6.7 分配器
1.6.8 赋值器的读写操作
1.6.9 原子操作
1.6.10 集合、多集合、序列以及元组
第2章 标记-清扫回收
2.1 标记-清扫算法
2.2 三色抽象
2.3 改进的标记-清扫算法
2.4 位图标记
2.5 懒惰清扫
2.6 标记过程中的高速缓存不命中问题
2.7 需要考虑的问题
2.7.1 赋值器开销
2.7.2 吞吐量
2.7.3 空间利用率
2.7.4 移动,还是不移动
第3章 标记-整理回收
3.1 双指针整理算法
3.2 Lisp 2算法
3.3 引线整理算法
3.4 单次遍历算法
3.5 需要考虑的问题
3.5.1 整理的必要性
3.5.2 整理的吞吐量开销
3.5.3 长寿数据
3.5.4 局部性
3.5.5 标记-整理算法的局限性
第4章 复制式回收
4.1 半区复制回收
4.1.1 工作列表的实现
4.1.2 示例
4.2 遍历顺序与局部性
4.3 需要考虑的问题
4.3.1 分配
4.3.2 空间与局部性
4.3.3 移动对象
第5章 引用计数
5.1 引用计数算法的优缺点
5.2 提升效率
5.3 延迟引用计数
5.4 合并引用计数
5.5 环状引用计数
5.6 受限域引用计数
5.7 需要考虑的问题
5.7.1 应用场景
5.7.2 高级的解决方案
第6章 垃圾回收器的比较
6.1 吞吐量
6.2 停顿时间
6.3 内存空间
6.4 回收器的实现
6.5 自适应系统
6.6 统一垃圾回收理论
6.6.1 垃圾回收的抽象
6.6.2 追踪式垃圾回收
6.6.3 引用计数垃圾回收
第7章 内存分配
7.1 顺序分配
7.2 空闲链表分配
7.2.1 首次适应分配
7.2.2 循环首次适应分配
7.2.3 最佳适应分配
7.2.4 空闲链表分配的加速
7.3 内存碎片化
7.4 分区适应分配
7.4.1 内存碎片
7.4.2 空间大小分级的填充
7.5 分区适应分配与简单空闲链表分配的结合
7.6 其他需要考虑的问题
7.6.1 字节对齐
7.6.2 空间大小限制
7.6.3 边界标签
7.6.4 堆可解析性
7.6.5 局部性
7.6.6 拓展块保护
7.6.7 跨越映射
7.7 并发系统中的内存分配
7.8 需要考虑的问题
第8章 堆内存的划分
8.1 术语
8.2 为何要进行分区
8.2.1 根据移动性进行分区
8.2.2 根据对象大小进行分区
8.2.3 为空间进行分区
8.2.4 根据类别进行分区
8.2.5 为效益进行分区
8.2.6 为缩短停顿时间进行分区
8.2.7 为局部性进行分区
8.2.8 根据线程进行分区
8.2.9 根据可用性进行分区
8.2.10 根据易变性进行分区
8.3 如何进行分区
8.4 何时进行分区
第9章 分代垃圾回收
9.1 示例
9.2 时间测量
9.3 分代假说
9.4 分代与堆布局
9.5 多分代
9.6 年龄记录
9.6.1 集体提升
9.6.2 衰老半区
9.6.3 存活对象空间与柔性提升
9.7 对程序行为的适应
9.7.1 Appel式垃圾回收
9.7.2 基于反馈的对象提升
9.8 分代间指针
9.8.1 记忆集
9.8.2 指针方向
9.9 空间管理
9.10 中年优先回收
9.11 带式回收框架
9.12 启发式方法在分代垃圾回收中的应用
9.13 需要考虑的问题
9.14 抽象分代垃圾回收
第10章 其他分区策略
10.1 大对象空间
10.1.1 转轮回收器
10.1.2 在操作系统支持下的对象移动
10.1.3 不包含指针的对象
10.2 基于对象拓扑结构的回收器
10.2.1 成熟对象空间的回收
10.2.2 基于对象相关性的回收
10.2.3 线程本地回收
10.2.4 栈上分配
10.2.5 区域推断
10.3 混合标记-清扫、复制式回收器
10.3.1 Garbage-First回收
10.3.2 Immix回收以及其他回收
10.3.3 受限内存空间中的复制式回收
10.4 书签回收器
10.5 超引用计数回收器
10.6 需要考虑的问题
第11章 运行时接口
11.1 对象分配接口
11.1.1 分配过程的加速
11.1.2 清零
11.2 指针查找
11.2.1 保守式指针查找
11.2.2 使用带标签值进行精确指针查找
11.2.3 对象中的精确指针查找
11.2.4 全局根中的精确指针查找
11.2.5 栈与寄存器中的精确指针查找
11.2.6 代码中的精确指针查找
11.2.7 内部指针的处理
11.2.8 派生指针的处理
11.3 对象表
11.4 来自外部代码的引用
11.5 栈屏障
11.6 安全回收点以及赋值器的挂起
11.7 针对代码的回收
11.8 读写屏障
11.8.1 读写屏障的设计工程学
11.8.2 写屏障的精度
11.8.3 哈希表
11.8.4 顺序存储缓冲区
11.8.5 溢出处理
11.8.6 卡表
11.8.7 跨越映射
11.8.8 汇总卡
11.8.9 硬件与虚拟内存技术
11.8.10 写屏障相关技术小结
11.8.11 内存块链表
11.9 地址空间管理
11.10 虚拟内存页保护策略的应用
11.10.1 二次映射
11.10.2 禁止访问页的应用
11.11 堆大小的选择
11.12 需要考虑的问题
第12章 特定语言相关内容
12.1 终结
12.1.1 何时调用终结方法
12.1.2 终结方法应由哪个线程调用
12.1.3 是否允许终结方法彼此之间的并发
12.1.4 是否允许终结方法访问不可达对象
12.1.5 何时回收已终结对象
12.1.6 终结方法执行出错时应当如何处理
12.1.7 终结操作是否需要遵从某种顺序
12.1.8 终结过程中的竞争问题
12.1.9 终结方法与锁
12.1.10 特定语言的终结机制
12.1.11 进一步的研究
12.2 弱引用
12.2.1 其他动因
12.2.2 对不同强度指针的支持
12.2.3 使用虚对象控制终结顺序
12.2.4 弱指针置空过程的竞争问题
12.2.5 弱指针置空时的通知
12.2.6 其他语言中的弱指针
12.3 需要考虑的问题
第13章 并发算法预备知识
13.1 硬件
13.1.1 处理器与线程
13.1.2 处理器与内存之间的互联
13.1.3 内存
13.1.4 高速缓存
13.1.5 高速缓存一致性
13.1.6 高速缓存一致性对性能的影响示例:自旋锁
13.2 硬件内存一致性
13.2.1 内存屏障与先于关系
13.2.2 内存一致性模型
13.3 硬件原语
13.3.1 比较并交换
13.3.2 加载链接/条件存储
13.3.3 原子算术原语
13.3.4 检测-检测并设置
13.3.5 更加强大的原语
13.3.6 原子操作原语的开销
13.4 前进保障
13.5 并发算法的符号记法
13.6 互斥
13.7 工作共享与结束检测
13.8 并发数据结构
13.8.1 并发栈
13.8.2 基于单链表的并发队列
13.8.3 基于数组的并发队列
13.8.4 支持工作窃取的并发双端队列
13.9 事务内存
13.9.1 何谓事务内存
13.9.2 使用事务内存助力垃圾回收器的实现
13.9.3 垃圾回收机制对事务内存的支持
13.10 需要考虑的问题
第14章 并行垃圾回收
14.1 是否有足够多的工作可以并行
14.2 负载均衡
14.3 同步
14.4 并行回收的分类
14.5 并行标记
14.6 并行复制
14.6.1 以处理器为中心的并行复制
14.6.2 以内存为中心的并行复制技术
14.7 并行清扫
14.8 并行整理
14.9 需要考虑的问题
14.9.1 术语
14.9.2 并行回收是否值得
14.9.3 负载均衡策略
14.9.4 并行追踪
14.9.5 低级同步
14.9.6 并行清扫与并行整理
14.9.7 结束检测
第15章 并发垃圾回收
15.1 并发回收的正确性
15.1.1 三色抽象回顾
15.1.2 对象丢失问题
15.1.3 强三色不变式与弱三色不变式
15.1.4 回收精度
15.1.5 赋值器颜色
15.1.6 新分配对象的颜色
15.1.7 基于增量更新的解决方案
15.1.8 基于起始快照的解决方案
15.2 并发回收的相关屏障技术
15.2.1 灰色赋值器屏障技术
15.2.2 黑色赋值器屏障技术
15.2.3 屏障技术的完整性
15.2.4 并发写屏障的实现机制
15.2.5 单级卡表
15.2.6 两级卡表
15.2.7 减少回收工作量的相关策略
15.3 需要考虑的问题
第16章 并发标记-清扫算法
16.1 初始化
16.2 结束
16.3 分配
16.4 标记过程与清扫过程的并发
16.5 即时标记
16.5.1 即时回收的写屏障
16.5.2 Doligez-Leroy-Gonthier回收器
16.5.3 Doligez-Leroy-Gonthier回收器在Java中的应用
16.5.4 滑动视图
16.6 抽象并发回收框架
16.6.1 回收波面
16.6.2 增加追踪源头
16.6.3 赋值器屏障
16.6.4 精度
16.6.5 抽象并发回收器的实例化
16.7 需要考虑的问题
第17章 并发复制、并发整理算法
17.1 主体并发复制:Baker算法
17.2 Brooks间接屏障
17.3 自删除读屏障
17.4 副本复制
17.5 多版本复制
17.6 Sapphire回收器
17.6.1 回收的各个阶段
17.6.2 相邻阶段的合并
17.6.3 Volatile域
17.7 并发整理算法
17.7.1 Compressor回收器
17.7.2 Pauseless回收器
17.8 需要考虑的问题
第18章 并发引用计数算法
18.1 简单引用计数算法回顾
18.2 缓冲引用计数
18.3 并发环境下的环状引用计数处理
18.4 堆快照的获取
18.5 滑动视图引用计数
18.5.1 面向年龄的回收
18.5.2 算法实现
18.5.3 基于滑动视图的环状垃圾回收
18.5.4 内存一致性
18.6 需要考虑的问题
第19章 实时垃圾回收
19.1 实时系统
19.2 实时回收的调度
19.3 基于工作的实时回收
19.3.1 并行、并发副本回收
19.3.2 非均匀工作负载的影响
19.4 基于间隙的实时回收
19.4.1 回收工作的调度
19.4.2 执行开销
19.4.3 开发者需要提供的信息
19.5 基于时间的实时回收:Metronome回收器
19.5.1 赋值器使用率
19.5.2 对可预测性的支持
19.5.3 Metronome回收器的分析
19.5.4 鲁棒性
19.6 多种调度策略的结合:“税收与开支”
19.6.1 “税收与开支”调度策略
19.6.2 “税收与开支”调度策略的实现基础
19.7 内存碎片控制
19.7.1 Metronome回收器中的增量整理
19.7.2 单处理器上的增量副本复制
19.7.3 Stopless回收器:无锁垃圾回收
19.7.4 Staccato回收器:在赋值器无等待前进保障条件下的尽力整理
19.7.5 Chicken回收器:在赋值器无等待前进保障条件下的尽力整理(x86平台)
19.7.6 Clover回收器:赋值器乐观无锁前进保障下的可靠整理
19.7.7 Stopless回收器、Chicken回收器、Clover回收器之间的比较
19.7.8 离散分配
19.8 需要考虑的问题
术语表
参考文献
索引