垃圾回收算法手册:自动内存管理的艺术

2016-03-18 华章计算机

内容简介

PROSPECTUS

本书是自动内存管理领域的里程碑作品,汇集了这个领域里经过50多年的研究沉积下来的最佳实践,包含当代最重要的垃圾回收策略与技术,著译双馨。

几乎所有的现代编程语言都采用了垃圾回收机制,因此深入了解此方面内容对于所有开发者而言都大有裨益。对于不同垃圾回收器的工作方式,以及当前垃圾回收器所面临的各种问题,这本权威手册都提供了专业的解答。掌握这方面的知识之后,在面对多种不同的垃圾回收器以及各种调节选项时,相信开发者能够更有把握。
       全书共19章,第1章探讨为什么需要自动内存管理,并简要介绍对不同垃圾回收策略进行比较的方法;第2~5章详细描述4种经典的垃圾回收算法,包括标记-清扫算法、标记-整理算法、复制式回收算法和引用计数算法;第6章深入比较第2~5章所介绍的回收策略与算法;第7章介绍多种不同的内存分配技术,并进一步探究自动垃圾回收与显示内存管理这两种场景下分配策略的不同之处;第8章讨论为何需要将堆划分为多个不同的空间,以及如何管理这些空间;第9章介绍分代垃圾回收;第10章介绍大对象的管理策略以及其他分区策略;第11章介绍运行时接口包括指针查找、能够安全发起垃圾回收的代码位置、读写屏障等;第12章讨论特定语言相关内容,包括终结机制和弱引用;第13章探讨现代硬件系统给垃圾回收器的实现者所带来的新机遇与挑战,同时介绍同步、前进、结束、一致等问题的相关算法;第14章介绍如何在挂起所有应用程序线程的前提下使用多个线程进行垃圾回收;第15~18章介绍多种不同种类的并发回收器;第19章探讨垃圾回收在硬实时系统中的应用。

目  录

LIST

The Garbage Collection Handbook: the Art of Automatic Memory Management

出版者的话

译者序

前言

作者简介

第1章 引言  1

1.1 显式内存释放  1

1.2?自动动态内存管理  3

1.3 垃圾回收算法之间的比较  5

1.3.1 安全性  5

1.3.2 吞吐量  5

1.3.3 完整性与及时性  5

1.3.4 停顿时间  6

1.3.5 空间开销  7

1.3.6 针对特定语言的优化  7

1.3.7 可扩展性与可移植性  8

1.4 性能上的劣势  8

1.5 实验方法  8

1.6 术语和符号  10

1.6.1 堆  10

1.6.2 赋值器与回收器  11

1.6.3 赋值器根  11

1.6.4 引用、域和地址  11

1.6.5 存活性、正确性以及可达性  12

1.6.6 伪代码  12

1.6.7 分配器  13

1.6.8 赋值器的读写操作  13

1.6.9 原子操作  13

1.6.10 集合、多集合、序列以及元组  14

第2章 标记–清扫回收  15

2.1 标记–清扫算法  16

2.2 三色抽象  18

2.3 改进的标记–清扫算法  18

2.4 位图标记  19

2.5 懒惰清扫  21

2.6 标记过程中的高速缓存不命中问题  24

2.7 需要考虑的问题  25

2.7.1 赋值器开销  25

2.7.2 吞吐量  26

2.7.3 空间利用率  26

2.7.4 移动,还是不移动  26

第3章 标记–整理回收  28

3.1 双指针整理算法  29

3.2 Lisp 2算法  30

3.3 引线整理算法  32

3.4 单次遍历算法  34

3.5 需要考虑的问题  36

3.5.1 整理的必要性  36

3.5.2 整理的吞吐量开销  36

3.5.3 长寿数据  36

3.5.4 局部性  37

3.5.5 标记–整理算法的局限性  37

第4章 复制式回收  38

4.1 半区复制回收  38

4.1.1 工作列表的实现  39

4.1.2 示例  40

4.2 遍历顺序与局部性  42

4.3 需要考虑的问题  46

4.3.1 分配  46

4.3.2 空间与局部性  47

4.3.3 移动对象  48

第5章 引用计数  49

5.1 引用计数算法的优缺点  50

5.2 提升效率  51

5.3 延迟引用计数  52

5.4 合并引用计数  54

5.5 环状引用计数  57

5.6 受限域引用计数  61

5.7 需要考虑的问题  62

5.7.1 应用场景  62

5.7.2 高级的解决方案  62

第6章 垃圾回收器的比较  64

6.1 吞吐量  64

6.2 停顿时间  65

6.3 内存空间  65

6.4 回收器的实现  66

6.5 自适应系统  66

6.6 统一垃圾回收理论  67

6.6.1 垃圾回收的抽象  67

6.6.2 追踪式垃圾回收  67

6.6.3 引用计数垃圾回收  69

第7章 内存分配  72

7.1 顺序分配  72

7.2 空闲链表分配  73

7.2.1 首次适应分配  73

7.2.2 循环首次适应分配  75

7.2.3 最佳适应分配  75

7.2.4 空闲链表分配的加速  76

7.3 内存碎片化  77

7.4 分区适应分配  78

7.4.1 内存碎片  79

7.4.2 空间大小分级的填充  79

7.5 分区适应分配与简单空闲链表分配的结合  81

7.6 其他需要考虑的问题  81

7.6.1 字节对齐  81

7.6.2 空间大小限制  82

7.6.3 边界标签  82

7.6.4 堆可解析性  82

7.6.5 局部性  84

7.6.6 拓展块保护  84

7.6.7 跨越映射  85

7.7 并发系统中的内存分配  85

7.8 需要考虑的问题  86

第8章 堆内存的划分  87

8.1 术语  87

8.2 为何要进行分区  87

8.2.1 根据移动性进行分区  87

8.2.2 根据对象大小进行分区  88

8.2.3 为空间进行分区  88

8.2.4 根据类别进行分区  89

8.2.5 为效益进行分区  89

8.2.6 为缩短停顿时间进行分区  90

8.2.7 为局部性进行分区  90

8.2.8 根据线程进行分区  90

8.2.9 根据可用性进行分区  91

8.2.10 根据易变性进行分区  91

8.3 如何进行分区  92

8.4 何时进行分区  93

第9章 分代垃圾回收  95

9.1 示例  95

9.2 时间测量  96

9.3 分代假说  97

9.4 分代与堆布局  97

9.5 多分代  98

9.6 年龄记录  99

9.6.1 集体提升  99

9.6.2 衰老半区  100

9.6.3 存活对象空间与柔性提升  101

9.7 对程序行为的适应  103

9.7.1 Appel式垃圾回收  103

9.7.2 基于反馈的对象提升  104

9.8 分代间指针  105

9.8.1 记忆集  106

9.8.2 指针方向  106

9.9 空间管理  107

9.10 中年优先回收  108

9.11 带式回收框架  110

9.12 启发式方法在分代垃圾回收中的应用  112

9.13 需要考虑的问题  113

9.14 抽象分代垃圾回收  115

第10章 其他分区策略  117

10.1 大对象空间  117

10.1.1 转轮回收器  118

10.1.2 在操作系统支持下的对象移动  119

10.1.3 不包含指针的对象  119

10.2 基于对象拓扑结构的回收器  119

10.2.1 成熟对象空间的回收  120

10.2.2 基于对象相关性的回收  122

10.2.3 线程本地回收  123

10.2.4 栈上分配  126

10.2.5 区域推断  127

10.3 混合标记–清扫、复制式回收器  128

10.3.1 Garbage-First回收  129

10.3.2 Immix回收以及其他回收  130

10.3.3 受限内存空间中的复制式回收  133

10.4 书签回收器  134

10.5 超引用计数回收器  135

10.6 需要考虑的问题  136

第11章 运行时接口  138

11.1 对象分配接口  138

11.1.1 分配过程的加速  141

11.1.2 清零  141

11.2 指针查找  142

11.2.1 保守式指针查找  143

11.2.2 使用带标签值进行精确指针查找  144

11.2.3 对象中的精确指针查找  145

11.2.4 全局根中的精确指针查找  147

11.2.5 栈与寄存器中的精确指针查找  147

11.2.6 代码中的精确指针查找  157

11.2.7 内部指针的处理  158

11.2.8 派生指针的处理  159

11.3 对象表  159

11.4 来自外部代码的引用  160

11.5 栈屏障  162

11.6 安全回收点以及赋值器的挂起  163

11.7 针对代码的回收  165

11.8 读写屏障  166

11.8.1 读写屏障的设计工程学  167

11.8.2 写屏障的精度  167

11.8.3 哈希表  169

11.8.4 顺序存储缓冲区  170

11.8.5 溢出处理  172

11.8.6 卡表  172

11.8.7 跨越映射  174

11.8.8 汇总卡  176

11.8.9 硬件与虚拟内存技术  176

11.8.10 写屏障相关技术小结  177

11.8.11 内存块链表  178

11.9 地址空间管理  179

11.10 虚拟内存页保护策略的应用  180

11.10.1 二次映射  180

11.10.2 禁止访问页的应用  181

11.11 堆大小的选择  183

11.12 需要考虑的问题  185

第12章 特定语言相关内容  188

12.1 终结  188

12.1.1 何时调用终结方法  189

12.1.2 终结方法应由哪个线程调用  190

12.1.3 是否允许终结方法彼此之间的并发  190

12.1.4 是否允许终结方法访问不可达对象  190

12.1.5 何时回收已终结对象  191

12.1.6 终结方法执行出错时应当如何处理  191

12.1.7 终结操作是否需要遵从某种顺序  191

12.1.8 终结过程中的竞争问题  192

12.1.9 终结方法与锁  193

12.1.10 特定语言的终结机制  193

12.1.11 进一步的研究  195

12.2 弱引用  195

12.2.1 其他动因  196

12.2.2 对不同强度指针的支持  196

12.2.3 使用虚对象控制终结顺序  199

12.2.4 弱指针置空过程的竞争问题  199

12.2.5 弱指针置空时的通知  199

12.2.6 其他语言中的弱指针  200

12.3 需要考虑的问题  201

第13章 并发算法预备知识  202

13.1 硬件  202

13.1.1 处理器与线程  202

13.1.2 处理器与内存之间的互联  203

13.1.3 内存  203

13.1.4 高速缓存  204

13.1.5 高速缓存一致性  204

13.1.6 高速缓存一致性对性能的影响示例:自旋锁  205

13.2 硬件内存一致性  207

13.2.1 内存屏障与先于关系  208

13.2.2 内存一致性模型  209

13.3 硬件原语  209

13.3.1 比较并交换  210

13.3.2 加载链接/条件存储  211

13.3.3 原子算术原语  212

13.3.4 检测–检测并设置  213

13.3.5 更加强大的原语  213

13.3.6 原子操作原语的开销  214

13.4 前进保障  215

13.5 并发算法的符号记法  217

13.6 互斥  218

13.7 工作共享与结束检测  219

13.8 并发数据结构  224

13.8.1 并发栈  226

13.8.2 基于单链表的并发队列  228

13.8.3 基于数组的并发队列  230

13.8.4 支持工作窃取的并发双端队列  235

13.9 事务内存  237

13.9.1 何谓事务内存  237

13.9.2 使用事务内存助力垃圾回收器的实现  239

13.9.3 垃圾回收机制对事务内存的支持  240

13.10 需要考虑的问题  241

第14章 并行垃圾回收  242

14.1 是否有足够多的工作可以并行  243

14.2 负载均衡  243

14.3 同步  245

14.4 并行回收的分类  245

14.5 并行标记  246

14.6 并行复制  254

14.6.1 以处理器为中心的并行复制  254

14.6.2 以内存为中心的并行复制技术  258

14.7 并行清扫  263

14.8 并行整理  264

14.9 需要考虑的问题  267

14.9.1 术语  267

14.9.2 并行回收是否值得  267

14.9.3 负载均衡策略  267

14.9.4 并行追踪  268

14.9.5 低级同步  269

14.9.6 并行清扫与并行整理  270

14.9.7 结束检测  270

第15章 并发垃圾回收  271

15.1 并发回收的正确性  272

15.1.1 三色抽象回顾  273

15.1.2 对象丢失问题  274

15.1.3 强三色不变式与弱三色不变式  275

15.1.4 回收精度  276

15.1.5 赋值器颜色  276

15.1.6 新分配对象的颜色  276

15.1.7 基于增量更新的解决方案  277

15.1.8 基于起始快照的解决方案  277

15.2 并发回收的相关屏障技术  277

15.2.1 灰色赋值器屏障技术  278

15.2.2 黑色赋值器屏障技术  279

15.2.3 屏障技术的完整性  280

15.2.4 并发写屏障的实现机制  281

15.2.5 单级卡表  282

15.2.6 两级卡表  282

15.2.7 减少回收工作量的相关策略  282

15.3 需要考虑的问题  283

第16章 并发标记–清扫算法  285

16.1 初始化  285

16.2 结束  287

16.3 分配  287

16.4 标记过程与清扫过程的并发  288

16.5 即时标记  289

16.5.1 即时回收的写屏障  290

16.5.2 Doligez-Leroy-Gonthier回收器  290

16.5.3 Doligez-Leroy-Gonthier回收器在Java中的应用  292

16.5.4 滑动视图  292

16.6 抽象并发回收框架  293

16.6.1 回收波面  294

16.6.2 增加追踪源头  295

16.6.3 赋值器屏障  295

16.6.4 精度  295

16.6.5 抽象并发回收器的实例化  296

16.7 需要考虑的问题  296

第17章 并发复制、并发整理算法  298

17.1 主体并发复制:Baker算法  298

17.2 Brooks间接屏障  301

17.3 自删除读屏障  301

17.4 副本复制  302

17.5 多版本复制  303

17.6 Sapphire回收器  306

17.6.1 回收的各个阶段  306

17.6.2 相邻阶段的合并  311

17.6.3 Volatile域  312

17.7 并发整理算法  312

17.7.1 Compressor回收器  312

17.7.2 Pauseless回收器  315

17.8 需要考虑的问题  321

第18章 并发引用计数算法  322

18.1 简单引用计数算法回顾  322

18.2 缓冲引用计数  324

18.3 并发环境下的环状引用计数处理  326

18.4 堆快照的获取  326

18.5 滑动视图引用计数  328

18.5.1 面向年龄的回收  328

18.5.2 算法实现  328

18.5.3 基于滑动视图的环状垃圾回收  331

18.5.4 内存一致性  331

18.6 需要考虑的问题  332

第19章 实时垃圾回收  333

19.1 实时系统  333

19.2 实时回收的调度  334

19.3 基于工作的实时回收  335

19.3.1 并行、并发副本回收  335

19.3.2 非均匀工作负载的影响  341

19.4 基于间隙的实时回收  342

19.4.1 回收工作的调度  346

19.4.2 执行开销  346

19.4.3 开发者需要提供的信息  347

19.5 基于时间的实时回收:Metronome回收器  347

19.5.1 赋值器使用率  348

19.5.2 对可预测性的支持  349

19.5.3 Metronome回收器的分析  351

19.5.4 鲁棒性  355

19.6 多种调度策略的结合:“税收与开支”  355

19.6.1 “税收与开支”调度策略  356

19.6.2 “税收与开支”调度策略的实现基础  357

19.7 内存碎片控制  359

19.7.1 Metronome回收器中的增量整理  360

19.7.2 单处理器上的增量副本复制  361

19.7.3 Stopless回收器:无锁垃圾回收  361

19.7.4 Staccato回收器:在赋值器无等待前进保障条件下的尽力整理  363

19.7.5 Chicken回收器:在赋值器无等待前进保障条件下的尽力整理(x86平台)  365

19.7.6 Clover回收器:赋值器乐观无锁前进保障下的可靠整理  366

19.7.7 Stopless回收器、Chicken回收器、Clover回收器之间的比较  367

19.7.8 离散分配  368

19.8 需要考虑的问题  370

术语表  372

参考文献  383

索引  413

垃圾回收算法手册:自动内存管理的艺术 BOOK的更多相关文章

  1. GC垃圾回收机制,iOS内存管理。

    问题: MRC中通过调用静态方法创建的新对象,不再使用时需要对其发送release消息吗? 不需要,因为约定静态方法创建的对象会自动将其放入自动释放池,即已对其发送autorelease消息,因此不可 ...

  2. 自动内存管理算法 —— 标记和复制法

    最近阅读了<垃圾回收算法手册>这本经典的书籍,借此机会打算写几篇内存管理算法方面的文章,也算是自己的总结吧.                                         ...

  3. JVM虚拟机和垃圾回收算法

    类加载机制 双亲委派模型 垃圾回收算法 CMS G1 类加载机制 双亲委派模型 双亲委派模型: 需要加载一个类,先委托父类加载,父类找父类,依次递归加载;加载不到再由自己加载 垃圾回收算法 JVM的内 ...

  4. 6.GC垃圾回收算法和垃圾收集器的关系

    JAVAGC垃圾回收机制和常见垃圾回收算法 推荐博客:JVM垃圾回收机制和常见垃圾回收算法 JVM的内存结构.垃圾回收算法

  5. CLR via C#深解笔记七 - 自动内存管理(垃圾回收)

    每个应用程序都要使用这样或者那样的资源,比如文件.内存缓冲区.屏幕空间.网络连接.数据库资源等.事实上,在面向对象的环境中,每个类型都代表可供程序使用的一种资源. 要使用这些资源,必须为代表资源的类型 ...

  6. 【深入理解Java虚拟机】自动内存管理机制——垃圾回收机制

      Java与C++之间有一堵有内存动态分配和垃圾收集技术所围成的"高墙",墙外面的人想进去,墙里面的人却想出来.C/C++程序员既拥有每一个对象的所有权,同时也担负着每一个对象生 ...

  7. [CLR via C#]21. 自动内存管理(垃圾回收机制)

    目录 理解垃圾回收平台的基本工作原理 垃圾回收算法 垃圾回收与调试 使用终结操作来释放本地资源 对托管资源使用终结操作 是什么导致Finalize方法被调用 终结操作揭秘 Dispose模式:强制对象 ...

  8. Java GC 垃圾回收算法 内存分配

    垃圾回收(Garbage Collection, GC)是Java不同于c与c++的重要特性之一. 他帮助Java自动清空堆中不再使用的对象. 由于不需要手动释放内存,程序员在编程中也可以减少犯错的机 ...

  9. JVM内存分配策略,及垃圾回收算法

    本人免费整理了Java高级资料,一共30G,需要自己领取;传送门:https://mp.weixin.qq.com/s/JzddfH-7yNudmkjT0IRL8Q 说起垃圾收集(Garbage Co ...

随机推荐

  1. 【Pure】

    PureA set of small, responsive CSS modules that you can use in every web project.http://purecss.io/

  2. 【JSP】让HTML和JSP页面不缓存从Web服务器上重新获取页面

    用户退出后,如果点击浏览器上的后退按钮,Web应用将不能正确保护受保护的页面——在Session销毁后(用户退出)受保护的JSP页重新在浏览器中显示出来. 然而,如果用户点击返回页面上的任何链接,We ...

  3. 彩色网页变黑白色CSS代码变黑白色调!

    <style> html { -webkit-filter: grayscale(%); -moz-filter: grayscale(%); -ms-filter: grayscale( ...

  4. Java程序版权保护解决方案

    通常C.C++等编程语言开发的程序都被编译成目标代码,这些目标代码都是本机器的二进制可执行代码.通常所有的源文件被编译.链接成一个可执行文件.在这些可执行文件中,编译器删除了程序中的变量名称.方法名称 ...

  5. MyEclipse 下用link 方式安装插件

      N年之前,也是Java出身,后来转DBA,Java 就忘的差不多了. 最近计划好好研究下Python,还是选用MyEclipse 这个IDE了,多年没敲代码,很多东西都忘记了,做点笔记,备用. M ...

  6. linux 打开远程samba服务器

    sudo mount -t cifs //10.104.*.*data /home/leeyoung/samba/ -o username=123,password=123

  7. opencv 在工业中的应用:blob分析

    在工业中经常要检测一副图像中物体的数量,位置,大小,面积等信息,这就要用到BLOB分析,我用OPENCV做了个BLOB分析的DEMO. (1)打开一幅图像 (2)进行参数设置,设定二值化阙值,并选择是 ...

  8. POJ3264 Balanced Lineup 线段树区间最大值 最小值

    Q个数 问区间最大值-区间最小值 // #pragma comment(linker, "/STACK:1024000000,1024000000") #include <i ...

  9. 关于Aggregate 的一点用法

    比如 我们要 将数组或者对象中的某列或某属性 的值取出,然后 用 逗号隔开. 1.通常我们可能会用for 或foreach 来循环,然后将取出的值并添加至StringBuilder 2.用Aggreg ...

  10. WAMP下 搭建Zend Framework(Hello World)实例

    一.环境搭建 1.下载安装Zend Framework,此步骤不再详细叙述 2.配置php.ini文件 打开php.ini文件,可以找到如下的代码: ; Windows: "\path1;\ ...