首页>参考读物>计算机科学与技术>综合

垃圾回收算法手册:自动内存管理的艺术
作者 : [英]理查德·琼斯(Richard Jones)安东尼·霍思金(Antony Hosking)艾略特·莫斯(Eliot Moss)著
译者 : 王雅光 薛迪 译
丛书名 : 计算机科学丛书
出版日期 : 2016-03-08
ISBN : 978-7-111-52882-1
定价 : 139.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 451
开本 : 16
原书名 : The Garbage Collection Handbook: The Art of Automatic Memory Management
原出版社: Chapman & Hall/CRC
属性分类: 店面
包含CD :
绝版 : 未绝版
图书简介

图书特色

在自动内存管理领域,Richard Jones于1996年出版的《Garbage Collection: Algorithms for Automatic Dynamic Memory Management》可谓是一部里程碑式的作品。接近20年过去了,垃圾回收技术得到了非常大的发展,因此有必要将该领域当前最先进的技术呈现给读者。本书汇集了自动内存管理研究者和开发者们在过去50年间的丰富经验,在本书中,作者在一个统一的易于接受的框架内比较了当下最重要的回收策略以及最先进的回收技术。
本书从近年来硬件与软件的发展给垃圾回收所带来的新挑战出发,探讨了这些挑战给高性能垃圾回收器的设计者与实现者所带来的影响。在简单的传统回收算法之外,本书还涵盖了并行垃圾回收、增量式垃圾回收、并发垃圾回收以及实时垃圾回收。书中配备了丰富的伪代码与插图,以描述各种算法与概念。

本书特色
为1996年《Garbage Collection: Algorithms for Automatic Dynamic Memory Management》一书提供了完整的、最新的、权威的续作。
全面讲解并行垃圾回收算法、并发垃圾回收算法以及实时垃圾回收算法。
深入剖析某些垃圾回收领域的棘手问题,包括与运行时系统的接口。
提供在线数据库支持,包含超过2500条垃圾回收相关文献。


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


理查德·琼斯
(Richard Jones)
坎特伯雷-肯特大学计算机学院教授。1998年联合创立了国际存储管理研讨会,并担任首届会议主席。他发表了多篇关于垃圾回收技术、堆可视化技术、电子出版技术相关的论文,多次担任主要国际会议计划委员会的常务委员,同时还是《Software Practice and Experience》杂志的编辑委员会成员。因在动态存储管理领域的研究和学术成绩,他于2005年被聘任为格拉斯哥大学名誉研究员,2006年被计算机协会评为杰出科学家。

安东尼·霍思金
(Antony Hosking)
普渡大学西拉法叶分校计算机学院副教授。他的主要研究方向是编程语言的设计与实现,特别是数据库与持久化编程语言、面向对象数据库系统、动态存储管理、编译器优化以及编程语言和应用的架构支持。

艾略特·莫斯
(Eliot Moss)
马萨诸塞大学阿默斯特分校计算机科学学院教授。他的主要研究方向为编程语言及其实现,而且早在1978年就构建出垃圾回收器。除了自动存储管理领域之外,他在持久编程语言、虚拟机实现、事务性编程与事务内存方面也拥有较高的知名度。他曾与IBM研究员一起推动Jikes RVM Java虚拟机的学术研究许可,并最终促使其成为开源项目。

图书前言

1960年,McCarthy和Collins发表了第一篇有关自动动态内存管理(即垃圾回收)的论文。弹指一挥间,50多年后的今天,本书也已截稿。垃圾回收机制诞生于Lisp程序语言,无巧不成书,Lisp语言诞生于1958年,在其40周年之际,第一届国际内存管理研讨会(International Symposium on Memory Management)于1998年10月举办,而本书开始写作的时间也恰逢此次会议召开10周年。McCathy[1978]回忆他在麻省理工学院工业联络研讨会上第一次现场演示Lisp语言时的情形,他们本想给观众留下良好的第一印象,但不幸的是,IBM 704在演示的中途就耗尽了全部的32KB内存空间,电传打字机以每秒十个字符的速度输出
THE GARBAGE COLLECTOR HAS BEEN CALLED. SOME INTERESTING STATISTICS ARE AS FOLLOWS:
以及其他一些更加冗长的错误信息,这一问题几乎占据了当时的整个演示时间,于是McCarthy的项目小组不得不省略刷新Lisp核心映像的相关内容,并在观众的笑声中无奈地结束演示。50多年后的今天,垃圾回收早已不再是一个笑话,反而已经成为现代编程语言实现的关键组成部分之一。对于所有诞生于1990年之后且得到广泛应用的编程语言,Visual Basic(出现于1991年)是其中唯一一个没有采用自动内存管理的语言,但是其现代版本VB.NET(出现于2002年)却依赖于具备垃圾回收能力的微软公共语言运行时(Microsoft common language runtime)。
垃圾回收给软件开发带来的收益不胜枚举。它可以消除开发过程中的几大类错误,例如尝试对悬挂指针(即指向已经回收或错误甚至被重新分配出去的内存)进行解引用,或者对已经释放的内存进行二次释放。尽管其不能保证完全消除内存泄漏问题,但也能大幅减少该问题的出现几率,还能够大幅简化并发数据结构的构建和使用[Herlihy and Shavit, 2008]。综上所述,开发者能够基于垃圾回收所提供的抽象能力进行更好的软件工程实践。它简化了用户接口,使得代码更加容易理解和维护,进而更加可靠。由于用户接口不再需要关注内存管理,所以提升了代码的可复用性。
在过去的数年中,内存管理技术在软件和硬件方面都取得了长足进步。1996年,典型的Intel 奔腾处理器的时钟速度只有120MHz,就连基于Digital的Alpha芯片的高端工作站主频也只有266MHz。而在今天,主频达到3GHz以上的高端处理器以及多核芯片已经非常普遍,主存空间也几乎取得了1000倍的增长,普通台式计算机的内存大小已经从最初的几兆字节扩展到了4GB。尽管如此,DRAM内存的性能提升速度依然赶不上处理器的主频增长速度。我们曾在Garbage Collection: Algorithms for Automatic Dynamic Memory Management中指出,“垃圾回收是能够解决所有内存管理问题的灵丹妙药”,并特别指出“垃圾回收机制尚无法应用于硬实时系统(即系统必须在给定时限内对事件做出响应)”。但时至今日,硬实时垃圾回收器已经走出实验室并进入到商业应用领域。尽管现代垃圾回收器已经解决了大多数内存管理问题,但新硬件、新环境以及新应用的出现仍会在内存管理领域不断抛出新的问题与挑战。
致读者
本书试图将过去50多年间学者和开发者们在自动内存管理领域所积累的丰富经验加以总结。所涉文献数量庞大,在写作期间我们的在线资源库收集了多达2500条记录。在描述最重要的实现策略以及代表最先进水平的实现技术时,我们尽量在一个统一的、易于接受的框架内进行讨论与比较。我们特别注意使用统一的风格和术语来介绍相关的算法与概念,同时辅以伪代码和插图来描述具体细节。对于关乎性能的部分,我们特别注意对底层细节的描述,例如同步操作原语的选择、硬件组件(如高速缓存)对算法设计的影响。
在过去的10年间,硬件和软件设施的发展给垃圾回收领域带来了许多新的挑战。处理器和内存之间的性能差距总体在不断扩大。处理器时钟速度得到大幅增长,单个芯片上集成的处理器核心数量越来越多,使用多处理器的模块也越来越普遍。本书重点关注了这些变化对高性能垃圾回收器的设计与实现所造成的影响。由于高速缓存对性能的影响至关重要,所以垃圾回收算法必须考虑到局部性问题。越来越多的应用程序已经多线程化,且运行在多核处理器之上,因而我们应当避免内存管理器成为性能瓶颈。另外,垃圾回收器的设计应当充分利用硬件的并行能力。在Jones[1996]中,我们完全没有考虑如何使用多线程进行并行回收,只用一章的篇幅来介绍增量回收与并发回收,这在当时的书中显得格外引人注目。
本书自始至终都密切关注现代硬件所带来的机遇与限制,对局部性问题的考量将贯穿全书。我们默认应用程序可能是多线程的。尽管本书涵盖了很多更加简单、更加传统的算法,但我们还是花了全书近一半的篇幅来介绍并行回收、增量回收、并发回收以及实时回收。
我们希望本书能够帮助到对编程语言实现感兴趣的研究生、研究人员和开发人员。对于选修了编程语言、编译器构建、软件工程或操作系统方面高级课程的本科生而言,本书也会有所帮助。此外,我们希望专业开发人员能够通过本书更加深入地了解垃圾回收面临的相关问题、不同回收器的工作模式,我们相信,与具体的专业知识相结合,开发人员在面对多种垃圾回收方法时,能够更好地进行回收器的选型与配置。由于几乎所有的现代编程语言都提供了垃圾回收机制,所以全面了解这一课题对所有开发者来说都是不可或缺的。
本书结构
本书第1章以探讨为什么需要自动内存管理作为开篇,简要介绍了对不同垃圾回收策略进行比较的方法。该章结尾介绍了贯穿全书的抽象记法与伪代码描述方式。
接下来的4章详细描述了4种经典的垃圾回收算法,分别是标记–清扫算法、标记–整理算法、复制式回收算法以及引用计数算法。本书对这些回收算法进行了深入的研究,并特别关注了其在现代硬件设施上的实现。如果读者需要一些更加基础的介绍,可以参阅我们先前的一本书Garbage Collection: Algorithms for Automatic Dynamic Memory Management(Richard Jones and Rafael Lins, Wiley, 1996)。第6章深入比较了第2~5章所介绍的回收策略与算法,评估了它们各自的优缺点以及在不同情况下的适用性。
内存回收策略同样依赖于内存分配策略。第7章介绍了多种不同的内存分配技术,并进一步探究了自动垃圾回收与显式内存管理这两种场景下分配策略的不同之处。
前7章假定所有堆中的对象均采用相同的管理策略,但根据许多因素可知这并非一种良好的设计策略。第8章讨论了为何需要将堆划分为多个不同的空间,以及如何管理这些空间;第9章介绍了最成功的对象管理策略之一:分代垃圾回收;第10章介绍了大对象的管理策略以及其他分区策略。
在构建垃圾回收器的过程中,与运行时系统其他部分的对接是最复杂的内容之一。因此第11章用了一整章的篇幅来介绍运行时接口,包括指针查找、能够安全发起垃圾回收的代码位置、读写屏障等。第12章讨论了特定语言相关内容,包括终结机制和弱引用。
在接下来的章节中,我们将注意力集中在并发环境下。第13章探讨了现代硬件系统给垃圾回收器的实现者所带来的新机遇与挑战,同时介绍了同步、前进、结束、一致等问题的相关算法。第14章介绍如何在挂起所有应用程序线程的前提下使用多个线程进行垃圾回收。接下来的4章介绍了多种不同种类的并发回收器,它们均放宽了“万物静止”这一要求,其回收过程只需要给用户程序引入十分短暂的停顿。最后,第19章探讨了最富挑战性的课题,即垃圾回收在硬实时系统中的应用。
每一章结尾都总结了一些需要考虑的问题,其目的在于引导读者去思考自己的系统有什么样的需求,以及如何满足这些需求,这些问题不仅关乎用户程序的行为,也关乎操作系统,甚至底层硬件的形为。但这些问题并不能替代对具体章节的阅读,它们并不是描述现有解决方案,而是提供进一步研究的焦点。
本书缺少了哪些内容?我们仅仅讨论了内嵌于运行时系统的自动内存管理技术,即使编程语言指定了垃圾回收相关的规范,我们也没有深入探讨其所支持的其他内存管理机制。最明显的例子是区域(region)的应用[Tofte and Talpin, 1994],其在Java实时规范中占据着显著的地位。我们仅花费了少量的篇幅来介绍区域推断以及栈上分配技术,并且几乎没有涉及其他通过编译期分析来替代,甚至辅助垃圾回收的技术。尽管引用计数策略在C++等语言中得到了广泛应用,但我们依然认为它不是在用户程序中进行自动内存管理的最佳选择。最后,我们认为,下一代计算机将采用高度非一致内存架构,并配备异构垃圾回收器(heterogeneous collector)。这方面的技术与分布式垃圾回收(distributed garbage collection)的相关性较大,但在过去的数十年间,分布式垃圾回收领域鲜有新的研究成果发表,这不得不说是一件憾事。本书没有介绍分布式垃圾回收的相关内容。
在线资源
本书相关的电子资料参见:http://www.gchandbook.org。
该网站包含了大量垃圾回收相关资源,包括本书完整的参考文献。本书末尾所列的参考文献超过了400条,但我们的在线数据库中有超过2500条垃圾回收相关文献。该数据库支持在线搜索,同时还支持BibTeX、PostScript、PDF格式的下载。除了相关文章、论文、书籍之外,该参考文献还包含了某些文献的摘要,对于大多数存在电子版的文献,我们还给出了相关URL以及DOI信息。
我们将持续更新本书参考文献,并将其作为一项社区服务。如果有更多文献(或者修正意见),欢迎联系Richard(R.E.Jones@kent.ac.uk),我们将不胜感激。
致谢
感谢各位同事在本书编写时所给予的各项支持,没有大家的鼓励(与压力),本书的问世可能依然遥遥无期。特别需要感谢的是Steve Blackburn、Hans Boehm、David Bacon、Cliff Click、David Detlefs、Daniel Frampton、Robin Garner、Barry Hayes、Laurence Hellyer、Maurice Herlihy、Martin Hirzel、Tomá Kalibera、Doug Lea、Simon Marlow、Slan Mycroft、Cosmin Oancea、Erez Petrank、Fil Pizlo、Tony Printezis、John Reppy、David Siegwart、Gil Tene以及Mario Wolczko,感谢诸位十分耐心地解答了我们的许多疑问,并对本书的草稿给予诸多有用的反馈意见。同时我们也在此向1958年以来所有致力于自动内存管理研究的计算机科学家们致敬,没有他们的努力,本书也无从而来。
此外,我们还要向Taylor and Francis出版社的编辑Randi Cohen女士表示衷心的感谢,感谢她的支持和耐心。她总是能够及时地给予我们帮助,对我们的延误也展现出了最大程度的忍耐。同时还要感谢Elizabeth Haylett以及英国作家协会的帮助,并极力向各位作者推荐他们。
Richard Jones、Antony Hosking、Eliot Moss
首先我要特别感谢Robbie,本书从开始计划到最终完成,编写时间超过了预期,耗时两年,在此期间她忍受着我无法想象的巨大压力。本书的出版都归功于她!此外,如果没有另外两位合作者无尽的热情,本书是否能够问世恐怕还是很大一个问号。Tony和Eliot,很高兴也非常荣幸能与这两位勤奋博学的同事一起完成此书。
Richard Jones
2002年的夏天,Richard和我计划为他1996年的Garbage Collection: Algorithms for Automatic Dynamic Memory Management续写一部新书。在这6年当中,垃圾回收领域诞生了很多新的工作成果,因此有必要对前书的内容进行更新。当时我们不知道,这一本书的问世会再需要9年的时间,由此我不得不佩服Richard的耐心。当设想变成具体的计划时,我们有幸邀请到Eliot加入本书的编写工作中,没有他的全力协助,我们现在可能还处在焦虑的工作之中。本书的前期计划与工作是Richard与我在2008年休假期间展开的,且本书的编写工作受到了来自英国工程和物理科学研究委员会以及美国国家科学基金会的支持,我们在此表示感谢。在此,还要特别感谢Mandi的鼓励,感谢你同意我把大量的时间花费在这个项目之上,否则我是不可能完成这项工作的。
Antony Hosking
感谢另外两位合著者邀请我参与此项已经充分构思且已拟定出版的书籍编写项目。非常荣幸能与你们一同工作,也非常感谢你们能容忍我另类的写作风格。在此还要感谢英国皇家工程学院为我2009年11月的英国之行提供支持,这在很大程度上推进了此书的完成。除此之外,还要感谢其他基金会间接资助我们参加各种会议,并给予我们面对面交流的机会。最需要感谢的是我的妻子以及女儿能包容我出差或心思不在家庭上。她们的支持是最重要的,也是我最珍惜的!
Eliot Moss

上架指导

计算机\程序设计

封底文字

在自动内存管理领域,Richard Jones于1996年出版的《Garbage Collection: Algorithms for Automatic Dynamic Memory Management》可谓是一部里程碑式的作品。接近20年过去了,垃圾回收技术得到了非常大的发展,因此有必要将当前该领域最先进的技术呈现给读者。本书汇集了自动内存管理研究者和开发者们在过去50年间的丰富经验,在本书中,作者在一个统一的易于接受的框架内比较了当下最重要的回收策略以及最先进的回收技术。

本书从近年来硬件与软件的发展给垃圾回收所带来的新挑战出发,探讨了这些挑战给高性能垃圾回收器的设计者与实现者所带来的影响。在简单的传统回收算法之外,本书还涵盖了并行垃圾回收、增量式垃圾回收、并发垃圾回收以及实时垃圾回收。书中配备了丰富的伪代码与插图,以描述各种算法与概念。

本书特色:
·为1996年《Garbage Collection: Algorithms for Automatic Dynamic Memory Management》一书提供了完整的、最新的、权威的续作。
·全面讲解并行垃圾回收、并发垃圾回收以及实时垃圾回收算法。
·深入剖析某些垃圾回收领域的棘手问题,包括与运行时系统的接口。
·提供在线数据库支持,包含超过2500条垃圾回收相关文献。

作者简介

[英]理查德·琼斯(Richard Jones)安东尼·霍思金(Antony Hosking)艾略特·莫斯(Eliot Moss)著:暂无简介

译者简介

王雅光 薛迪 译:暂无简介

译者序

垃圾回收技术给编程所带来的好处是不言而喻的,它能够从根本上解决软件开发过程中的内存管理问题,大大提升开发效率。但是目前,垃圾回收领域的书籍却非常少。
本书可以说是垃圾回收领域排名第二的经典著作之一,排名第一的也出自同一作者之手。1996年,Jones等的Garbage Collection: Algorithms for Automatic Dynamic Memory Management一书出版,并于2004年译成中文。回顾1996年,垃圾回收技术的大范围应用才刚刚起步——C++正称霸着软件开发领域,Java语言才推出一年之久,Anders Hejlsberg(C#之父,.NET的创立者)刚刚加入微软公司。近20年过去了,垃圾回收技术早已在各种编程语言中遍地开花,而且几乎成为每种新诞生语言的标配。与1996年的Garbage Collection: Algorithms for Automatic Dynamic Memory Management一书相比,本书不仅在内容上更加丰富,而且更加注重充分利用近20年来硬件发展所带来的机遇与挑战。
本书从最基础的垃圾回收算法出发,进一步介绍了到目前为止已经十分成熟的工业级垃圾回收技术实现(例如分代回收机制),这些内容基本上算是垃圾回收领域的“经典”内容。与此同时,面对多核技术的发展以及并行程序的普及,本书使用接近一半的篇幅介绍了如何充分利用多处理器的能力来实现垃圾回收(例如并行回收、并发回收等),相关技术大都是近些年才研发出来的新成果,代表着垃圾回收领域最先进的发展方向。本书最后进一步介绍了垃圾回收技术在实时系统领域的最新研究成果。
对于开发人员而言,在享受垃圾回收机制所带来便利的同时,是否曾想过隐藏在它背后的秘密?在进行技术选型时,如何评估垃圾回收对性能可能造成的影响?面对编程语言所提供的种类繁多的垃圾回收相关参数,应当如何进行配置与调优?通过本书,开发人员能够更加深入地了解垃圾回收方面的相关问题、不同回收器的工作模式。对于研究生以及大学生而言,如果他们对编程语言的垃圾回收机制的技术实现感兴趣,本书将是不二之选。
最后,我要感谢那些在翻译过程中给予我帮助与支持的人。首先要感谢《Java虚拟机规范(Java SE 7版)》的译者薛迪将我引入技术书籍翻译这个领域,并在翻译过程中指出我的许多不足。同时还要感谢机械工业出版社的吴怡和张梦玲编辑对我的帮助,以及对我延迟交稿的包容。最后要特别感谢的是我的妻子,在这一年多的时间里,翻译工作让我没有太多的时间陪她,在此致以深深的歉意。

王雅光
2015年12月

图书目录

出版者的话
译者序
前言
作者简介
第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

教学资源推荐
参考读物推荐
作者: 苏杰,唐韧,董超华 等著
作者: [美]赫克托·奎斯塔(Hector Cuesta)桑帕斯·库马尔(Dr.Sampath Kumar) 著
作者: (美)Anthony T. Velte; Toby J. Velte; Robert Elsenpeter 著