产品特色
编辑推荐
Ruby之父松本行弘推荐:上古传承之魔法,彻底揭开垃圾回收的秘密!
日本天才程序员兼LISP黑客竹内郁雄审校
254幅图解,轻松掌握GC经典算法
实际源码剖析,深入探讨GC具体实现
从入门到进阶,一本书掌握自动内存回收的机制!
1.全面涵盖GC经典算法
标记-清除算法、引用计数法、复制算法、标记-压缩算法、保守式GC、分代GC、增量式GC、RC Immix算法,一网打尽!
2.理论结合实际
在系统介绍GC算法的基础上,重点解读Python、DalvikVM、Rubinius、V8等几种实用系统中的GC代码,探究GC算法的实际应用,做到了理论和实际的平衡统一。
3.图文直观、讲解细致
配合大量形象的插图和代码,将各个知识点掰开揉碎讲解,非常适合入门学习。
内容简介
本书分为“算法篇”和“实现篇”两大部分。算法篇介绍了标记-清除算法、引用计数法、复制算法、标记-压缩算法、保守式GC、分代垃圾回收、增量式垃圾回收、RCImmix算法等几种重要的算法;实现篇介绍了垃圾回收在Python、DalvikVM、Rubinius、V8等几种语言处理程序中的具体实现。
作者简介
中村成洋 ,Network Applied Communication Laboratory Ltd. 研究员。
因为偶然的机会对GC产生浓厚兴趣,其本人却说不清楚为何喜欢GC,当被人追问原因时,总是回答“是缘分”。现在是CRuby的commiter,每天致力于GC的改善。
执笔本书“实现篇”。
相川光 ,游戏开发者。
京都大学在学期间开始研究GC。热爱GC但讨厌打扫。除了GC之外还喜欢咖喱。
执笔本书“算法篇”。
竹内郁雄(审校) ,东京大学名誉教授。
热爱对象,甚至会给因为bug没能得到重复利用而死去(释放)的对象上供。
日本Lisp黑客,著有《LISP入门》(初めての人のためのLISP)。
目录
序章
GC的定义 1
GC的好处 2
GC的历史 3
为什么我们现在要学GC 4
读者对象 6
本书中的符号 7
算法篇
第1章 学习GC之前
1.1 对象/头/域 12
1.2 指针 14
1.3 mutator 15
1.4 堆 15
1.5 活动对象/非活动对象 16
1.6 分配 16
1.7 分块 17
1.8 根 17
1.9 评价标准 19
第2章 GC标记-清除算法
2.1 什么是GC标记-清除算法 22
2.2 优点 29
2.3 缺点 29
2.4 多个空闲链表 31
2.5 BiBOP法 33
2.6 位图标记 34
2.7 延迟清除法 37
第3章 引用计数法
3.1 引用计数的算法 40
3.2 优点 44
3.3 缺点 44
3.4 延迟引用计数法 46
3.5 Sticky引用计数法 50
3.6 1位引用计数法 52
3.7 部分标记-清除算法 55
第4章 GC复制算法
4.1 什么是GC复制算法 66
4.2 优点 73
4.3 缺点 74
4.4 Cheney的GC复制算法 74
4.5 近似深度优先搜索方法 78
4.6 多空间复制算法 83
第5章 GC标记-压缩算法
5.1 什么是GC标记-压缩算法 89
5.2 优点 94
5.3 缺点 95
5.4 Two-Finger算法 95
5.5 表格算法 100
5.6 ImmixGC算法 106
第6章 保守式GC
6.1 什么是保守式GC 119
6.2 优点 122
6.3 缺点 122
6.4 准确式GC 123
6.5 间接引用 125
6.6 MostlyCopyingGC 127
6.7 黑名单 139
第7章 分代垃圾回收
7.1 什么是分代垃圾回收 142
7.2 Ungar的分代垃圾回收 143
7.3 优点 153
7.4 缺点 154
7.5 记录各代之间的引用的方法 154
7.6 多代垃圾回收 156
7.7 列车垃圾回收 157
第8章 增量式垃圾回收
8.1 什么是增量式垃圾回收 166
8.2 优点和缺点 174
8.3 Steele的算法 174
8.4 汤浅的算法 176
8.5 比较各个写入屏障 178
第9章 RC Immix算法
9.1 目的 180
9.2 合并型引用计数法 180
9.3 合并型引用计数法和Immix的融合 185
9.4 优点和缺点 189
实现篇
第10章 Python的垃圾回收
10.1 本章前言 192
10.2 对象管理 194
10.3 Python的内存分配器 196
10.4 第0层 通用的基础分配器 197
10.5 第1层 Python低级内存分配器 198
10.6 第2层 Python对象分配器 208
10.7 第3层 对象特有的分配器 231
10.8 引用计数法 234
10.9 引用的所有权 239
10.10 如何应对有循环引用的垃圾对象 245
10.11 性能调整的建议 269
第11章 DalvikVM的垃圾回收
11.1 本章前言 271
11.2 重新学习mmap 275
11.3 DalvikVM的源代码 279
11.4 DalvikVM的GC算法 282
11.5 对象管理 282
11.6 标记阶段 299
11.7 清除阶段 322
11.8 Q&A; 327
第12章 Rubinius的垃圾回收
12.1 本章前言 329
12.2 Rubinius的GC算法 333
12.3 对象管理 334
12.4 走向准确式GC之路 343
12.5 GC复制算法 359
12.6 Q&A; 375
第13章 V8的垃圾回收
13.1 本章前言 379
13.2 V8的GC算法 382
13.3 对象管理 382
13.4 通往准确式GC之路(V8篇) 389
13.5 GC标记-压缩算法 398
13.6 标记阶段 400
13.7 压缩阶段 412
13.8 Q&A; 431
附录
附录A 简单语言入门:Python篇 432
附录B 简单语言入门:Java篇 435
附录C 简单语言入门:Ruby篇 436
附录D 简单语言入门:JavaScript篇 437
后记 439
参考文献 441
前言/序言
《数据结构与算法在现代计算中的应用》 内容简介 在信息爆炸的时代,如何高效、优雅地处理和组织海量数据,是每一位计算机科学从业者必须面对的挑战。本书《数据结构与算法在现代计算中的应用》旨在深入探讨数据结构与算法的核心概念,并着重阐述它们在当今复杂多变的计算环境中的实际应用。我们不局限于理论的堆砌,而是力求通过深入浅出的讲解和贴近实际的案例,帮助读者建立扎实的基础,掌握解决实际问题的能力。 本书分为几个主要部分,每一部分都层层递进,构建一个完整的知识体系。 第一部分:数据结构的基础与演进 在这一部分,我们首先回顾和梳理了最基本、最经典的数据结构,例如数组、链表、栈和队列。我们会详细解析它们的底层实现原理、时间复杂度和空间复杂度,并讨论它们各自适用的场景。例如,我们会深入剖析链表在动态内存管理和实现某些高级数据结构(如哈希表)中的重要作用,以及栈和队列在表达式求值、广度优先搜索等算法中的关键地位。 随后,我们将目光投向更复杂、更强大的数据结构,包括树形结构和图结构。对于树,我们会深入讲解二叉树、二叉搜索树(BST),以及平衡二叉搜索树,如AVL树和红黑树。我们会详细分析这些平衡树的插入、删除、查找操作的平均和最坏情况复杂度,并阐述它们如何在保证高效查找的同时,维持数据的有序性。还会探讨多路查找树,如B树及其变种,以及它们在数据库和文件系统中的广泛应用。 图结构是表示对象之间关系的强大工具。我们会从图的定义、表示方法(邻接矩阵、邻接表)入手,逐步深入到各种图的遍历算法,如深度优先搜索(DFS)和广度优先搜索(BFS)。接着,我们会探讨图的连通性、最短路径问题(Dijkstra算法、Floyd-Warshall算法)以及最小生成树问题(Prim算法、Kruskal算法),并分析这些算法在网络路由、社交网络分析、地图导航等领域的实际应用价值。 最后,本部分还将触及一些现代数据结构,如散列表(哈希表)。我们会详细讲解散列函数的设计原则、冲突解决方法(链地址法、开放地址法),并分析散列表在数据库索引、缓存、成员资格检测等场景下的卓越性能。 第二部分:算法的设计范式与核心思想 数据结构是信息的组织方式,而算法则是对信息进行处理的步骤。本部分将聚焦于算法的设计思想和核心范式,为读者提供解决问题的通用方法论。 我们将从最基础的算法设计范式——分治法开始。我们会通过经典的例子,如归并排序、快速排序、矩阵乘法等,来阐述分治法的核心思想:将大问题分解为若干个规模较小的相同问题,递归地解决这些子问题,然后将子问题的解合并起来,形成大问题的解。我们会深入分析这些算法的时间复杂度,并讨论分治法的适用条件。 接着,我们将深入探讨动态规划(DP)。动态规划是解决具有重叠子问题和最优子结构性质的复杂问题的强大工具。我们会通过一系列经典的DP问题,如斐波利瓦数列、背包问题、最长公共子序列、矩阵链乘法等,来讲解DP的核心思想:将问题分解为相互关联的子问题,通过记录和重用子问题的解来避免重复计算,从而达到最优解。我们会强调状态定义、状态转移方程的建立以及边界条件的设定。 贪心算法是另一种重要的设计范式。贪心算法在每一步选择中都采取当前状态下最好或最优(局部最优)的选择,从而希望得到全局最优解。我们会通过活动选择问题、霍夫曼编码、最小生成树(Prim和Kruskal算法)等例子,来讲解贪心算法的设计思路,并重点分析其正确性的证明方法,以及并非所有问题都能用贪心算法解决。 此外,本部分还将介绍回溯法和分支限界法。回溯法是一种通过探索所有可能的解来找到满足条件的解的算法,它在解决组合问题、图着色问题、N皇后问题等方面有着广泛的应用。分支限界法则是在回溯法的基础上,增加剪枝操作,避免搜索不必要的解空间。 第三部分:算法分析与性能优化 理解算法的效率至关重要。本部分将深入讲解如何对算法进行分析,以及如何进行性能优化。 我们会详细讲解渐进符号(Big O, Big Omega, Big Theta),以及如何利用它们来描述算法的时间复杂度和空间复杂度。我们将演示如何通过分析算法的循环、递归调用等来推导出其渐进复杂度,并解释为什么理解最坏情况、平均情况和最好情况下的复杂度都很重要。 除了理论分析,我们还将探讨实际的性能优化技巧。这包括: 常数因子优化:虽然渐进复杂度更重要,但在实际应用中,常数因子有时也能带来显著的性能提升。我们会讨论如何通过更精细的代码实现、避免不必要的函数调用、优化内存访问模式等方式来优化常数因子。 算法替换:在某些情况下,选择一个不同渐进复杂度但更适合特定问题规模或数据分布的算法,可能比优化现有算法更有效。 数据结构的选择:正确选择和使用数据结构是影响算法性能的关键因素。我们会再次强调不同数据结构在不同操作下的性能特点,以及如何根据具体需求进行权衡。 空间换时间:在内存允许的情况下,利用额外的空间来存储中间结果或预计算信息,可以显著减少计算时间。我们将讨论各种“空间换时间”的策略。 并行与分布式计算:随着多核处理器和分布式系统的普及,如何设计和实现能够利用并行计算能力的算法,将是性能优化的重要方向。我们将简要介绍并行算法的基本思想和一些常用模型。 第四部分:现代计算领域的算法应用 在这一部分,我们将把前面学到的数据结构和算法知识,应用到现代计算的各个热门领域,展示它们强大的生命力和解决实际问题的能力。 搜索引擎与信息检索:我们将探讨倒排索引、TF-IDF模型、PageRank算法等在搜索引擎中的应用,讲解如何高效地存储和检索海量文本数据。 数据库系统:深入分析B+树、哈希索引等数据结构在数据库索引中的作用,以及SQL查询优化、事务处理背后的算法思想。 机器学习与人工智能:我们将介绍支持向量机(SVM)、决策树、神经网络等算法的基本原理,以及它们在模式识别、预测分析等领域的应用。我们会重点关注数据预处理、特征提取、模型训练和评估等环节中的算法选择。 计算机图形学:探讨光线追踪、渲染算法、碰撞检测等图形学领域中的算法,以及它们如何在游戏、动画等领域实现逼真的视觉效果。 网络与分布式系统:讲解路由算法(如BGP)、负载均衡算法、一致性协议(如Paxos、Raft)在构建稳定高效的网络和分布式系统中的重要性。 计算生物学与基因组学:探讨序列比对算法、基因组组装算法等在生命科学研究中的应用,以及如何处理和分析大规模生物数据。 学习建议与展望 本书的编写过程中,我们始终秉持着“理论与实践相结合”的原则。我们鼓励读者在学习过程中,积极动手实践,通过编写代码来加深对算法和数据结构的理解。书中提供的案例分析和练习题,旨在帮助读者巩固知识,并培养独立解决问题的能力。 数据结构与算法是计算机科学的基石,其重要性不言而喻。随着计算技术的不断发展,新的数据结构和算法也在不断涌现。本书的目标是为读者打下坚实的基础,使其能够快速适应新的技术和挑战,在未来的计算领域中不断探索和创新。我们相信,掌握了本书中的知识,您将能够更自信、更有效地应对各种复杂的计算问题。