垃圾回收的算法与实现
元数据
垃圾回收的算法与实现
- 书名: 垃圾回收的算法与实现
- 作者: 中村成洋 相川光
- 简介: 本书分为“算法篇”和“实现篇”两大部分。算法篇介绍了标记-清除算法、引用计数法、复制算法、标记-压缩算法、保守式GC、分代垃圾回收、增量式垃圾回收、RC Immix算法等几种重要的算法;实现篇介绍了垃圾回收在Python、DalvikVM、Rubinius、V8等几种语言处理程序中的具体实现。本书适合各领域程序员阅读。
- 出版时间 2016-08-08 00:00:00
- ISBN: 9787115427472
- 分类: 计算机-编程设计
- 出版社: 人民邮电出版社
- PC地址:https://weread.qq.com/web/reader/82632d50718ff64b82667f3
高亮划线
审校者前言
📌 GC相当于虚拟内存。一般的虚拟内存技术是在较小的物理内存的基础上,利用辅助存储创造一片看上去很大的“虚拟”地址空间。也就是说,GC是扩大内存空间的技术,因此我称其为空间性虚拟存储。
⏱ 2024-02-11 10:16:43 ^26211915-5-1774-1864
前言
📌 净是拿比自己弱的人当对手,不可能有意思。没有人能一看到谜题就瞬间解出答案。读到一半就知道犯人的推理小说真是无聊透顶。将自身能力发挥至极限去解开问题,这时才能把知识变成自己的东西。——青木峰郎《Ruby源代码完全解读》
⏱ 2024-02-11 10:20:20 ^26211915-6-421-654
序章
📌 GC是Garbage Collection的简称,中文称为“垃圾回收”。
⏱ 2024-02-11 10:21:50 ^26211915-9-752-788
📌 GC要做的有两件事。1.找到内存空间里的垃圾2.回收垃圾,让程序员能再次利用这部分空间满足这两项功能的程序就是GC。
⏱ 2024-02-11 10:22:07 ^26211915-9-1140-1363
📌 John McCarthy身为Lisp之父和人工智能之父,是一名非常有名的黑客,事实上他同时也是GC之父(多么伟大的黑客啊)。1960年,McCarthy在其论文 [1]中首次发布了GC算法。
⏱ 2024-02-11 10:25:18 ^26211915-9-3037-3189
📌 1960年,George E. Collins在论文 [6]中发布了叫作引用计数的GC算法。当时Collins可能没有注意到,引用计数法有个缺点,就是它不能回收“循环引用”[插图]。Harold McBeth [26]在1963年指出了这个缺点。
⏱ 2024-02-11 10:25:29 ^26211915-9-3635-3934
📌 1963年,也有“人工智能之父”之称的Marvin L. Minsky在论文 [7]中发布了复制算法。
⏱ 2024-02-11 10:26:08 ^26211915-9-4003-4081
📌 GC基本上是高负载处理,需要花费一定的时间。打个比方,当编写像动作游戏这样追求即时性的程序时,就必须尽量压低GC导致的最大暂停时间。如果因为GC导致玩家频繁卡顿,相信谁都会想摔手柄。碰到这种应用,我们就需要选择最大暂停时间较短的GC算法了。
⏱ 2024-02-11 10:27:26 ^26211915-9-5468-5588
📌 GC中经常用到栈和队列等数据结构。栈是一种将后进入的数据先取出的数据结构,即FILO(First-In Last-Out)。与其相反,队列是将先进入的数据先取出的数据结构,即FIFO(First-In First-Out)。
⏱ 2024-02-11 10:30:21 ^26211915-9-10445-10557
算法篇
📌 mutator是Edsger Dijkstra [15]琢磨出来的词,有“改变某物”的意思。说到要改变什么,那就是GC对象间的引用关系。不过光这么说可能大家还是不能理解,其实用一句话概括的话,它的实体就是“应用程序”。这样说就容易理解了吧。GC就是在这个mutator内部精神饱满地工作着
⏱ 2024-02-11 14:05:49 ^26211915-10-4045-4216
📌 伴随这些变化会产生垃圾,而负责回收这些垃圾的机制就是GC。
1.4 堆
堆指的是用于动态(也就是执行程序时)存放对象的内存空间。当mutator申请存放对象时,所需的内存空间就会从这个堆中被分配给mutator。
GC是管理堆中已分配对象的机制。在开始执行mutator前,GC要分配用于堆的内存空间。一旦开始执行mutator,程序就会按照mutator的要求在堆中存放对象。等到堆被对象占满后,GC就会启动,从而分配可用空间。如果不能分配足够的可用空间,一般情况下我们就要扩大堆。
然而,为了让读者能更容易理解,在“算法篇”中我们把堆的大小固定为常量HEAP_SIZE,不会进行扩大。
⏱ 2024-02-11 14:06:06 ^26211915-10-4510