我想学习垃圾收集背后的理论。我该怎么做呢?显而易见的答案是 - 编译器教科书......问题是,是否有必要学习词法分析,解析和其他通常在文本中垃圾收集之前的东西?
简而言之,了解垃圾收集理论的先决条件是什么?
P.S - 我知道解析,词法分析等的目的是什么。只是不知道它们是如何实现的。
按顺序阅读这些文章。它们处于渐进主题/难度顺序(不是按时间顺序排列)。
我上学期参加了课程,所以我读了所有这些,我不得不说我学到了我要学习的东西!
请注意,下面大部分论文的免费副本链接都包含在garbage-collection的https://stackoverflow.com/tags/garbage-collection/info标签维基中。
我想学习垃圾收集背后的理论。我该怎么做呢?
我也是一个对垃圾收集感兴趣的dabbler(我写了自己的垃圾收集VM,称为HLVM)。我通过阅读尽可能多的关于垃圾收集的研究论文来学习,因为我可以亲自动手并自己玩这些想法,既可以在我的虚拟机中生成,也可以通过编写内存安全的高级模拟。
显而易见的答案是 - 编译器教科书......问题是,是否有必要学习词法分析,解析和其他通常在文本中垃圾收集之前的东西?
词法分析,解析和其他东西与垃圾收集无关。您可能会从编译器书籍中获得有关垃圾收集的过时粗略概述,但您需要阅读研究论文以获取最新视图,例如:关于多核。
简而言之,了解垃圾收集理论的先决条件是什么?
您需要了解基本图论,指针,堆栈,线程和(如果您对多线程感兴趣)低级并发原语(如锁)。
垃圾收集就是确定可达性。当程序无法再获取对值的引用,因为该值已无法访问时,GC可以回收值占用的内存。可达性是通过从一组“全局根”(线程堆栈和核心寄存器中的全局变量和指针)开始遍历堆来确定的。
GC设计有许多方面,但您可以从四个主要的垃圾收集算法开始:
也许这些基本概念最引人注目的演变是分代垃圾收集,这是多年来事实上的标准设计。
我个人的感觉是,一些关于垃圾收集的模糊工作传达了同样多的有用信息,所以我也强烈建议:
您可能还想研究三种写屏障(Dijkstra's,Steele's和Yuasa's),并查看卡片标记和记忆设置技巧。
然后,您可能还想检查一些实现者为Java和.NET等语言实现选择的实际设计决策,以及Standard ML的SML / NJ编译器,OCaml编译器,Glasgow Haskell编译器等。采用的技术之间的差异与它们之间的相似之处一样大!
还有一些很好的切向相关的论文,如亨德森的Accurate Garbage Collection in an Uncooperative Environment。我使用该技术来避免为HLVM编写堆栈walker。
memorymanagement.org网站是一个宝贵的资源,特别是GC相关术语的词汇表。
有一本关于垃圾收集的书,如果我可以添加一个相当不错的书:
Richard Jones和Rafael Lins,Garbage Collection,Wiley and Sons(1996),ISBN 0471941484
理查德琼斯还有一个很好的网站收集garbage collection resources。
大多数早期的垃圾收集文件都非常易读。你可以从保罗威尔逊对"Uniprocessor Garbage Collection Techniques"(1992,LNCS vol.637)的调查开始,然后深入探讨有关主题的原始文献。
您可能还想看看Squeak: Open Personal Computing,它涵盖了Squeak Smalltalk垃圾收集器,以及其他ST设计问题。您还应该看看Squeak itself - 它几乎完全用Smalltalk编写,包括GC在内的所有源代码都是免费提供的,并且使用Smalltalk浏览器可以轻松学习。