是否有满足这些要求的垃圾收集算法?

时间:2011-02-01 13:47:56

标签: algorithm compiler-construction garbage-collection

我正在为静态类型的面向对象语言编写一个编译器。目前我正在研究垃圾收集算法。我想知道是否有一个收藏家:

  • 开源并记录,以便我可以实现它。
  • Acurrate
  • 全局,即每个进程只有一个收集器,而不是每个进程一个收集器。
  • 增量和/或并发,以避免来自主要馆藏的长时间暂停。
  • 适合此编程范例。一个不会成为收集者的例子,在破坏性赋值的情况下变得非常慢。

编辑:为了澄清,我想知道是否有一个可实现的算法可以做到这一点,而不是有一个现成的收集器。

6 个答案:

答案 0 :(得分:5)

实际上有一种实验性垃圾收集算法可以满足您的所有要求:简单的自动引用计数。总的来说,引用计数确实没有获得足够的信用作为一种可行的选择,但实际上它在很多情况下都能很好地工作,从来没有任何大的延迟,并且不需要复杂的魔法。

一个问题仍然是清理循环引用,你至少可以这样做很少;关心速度的应用程序开发人员可以在需要对象消失时明确地打破循环。

一个引人注目的引用计数功能是它比其他形式的垃圾收集更加直流友好。如果您正在运行循环,每次循环都会分配一些小的临时对象,那么引用GC(或显式内存管理)当然可以每次重用相同的内存,从而避免不必要的缓存刷新。任何其他类型的GC都只会定期释放对象,从而导致更大的内存占用,从而导致速度变慢。

重度计数对于大量多线程系统来说效率不高,因为每次触摸引用计数时都需要获取锁。但是如果你无论如何都要设计一种新语言,你可以做的就是提高整个语言的性能和可靠性:防止几乎所有对象在线程之间共享。即。明确分享。如果这样做,您将知道哪些对象与未共享,因此在递增/递减引用计数时哪些对象需要被锁定,哪些对象可以解锁。当没有任何锁定时,引用计数性能非常好。

答案 1 :(得分:2)

(我宁愿把它作为评论,但我没有足够的代表。)

如果您正在寻找算法而不是代码,我会定义一下学术文章。我偶然发现了OOPSLA 2003的会议录,我立即想起了你的问题 - 他们在垃圾收集上有两个会话:

http://www.oopsla.org/oopsla2003/files/pap-session-garbage-collection-1.html
http://www.oopsla.org/oopsla2003/files/pap-session-garbage-collection-2.html

开始研究的那些“大爆炸”时刻的优势在于,您可以在任何看起来很有前途的文章中使用Google学术搜索,并通过寻找标题来查看是否有更多最新的跟进然后单击“引用者”链接,例如:

http://scholar.google.com/scholar?cites=11437015034573374705&as_sdt=2005&sciodt=0,5&hl=en

(因为你有这么多的要求,你可能不得不在找到你的飞行收藏家之前亲吻许多青蛙。)

答案 2 :(得分:0)

你可能从单声道窃取垃圾收集器,这是.Net的开源实现。他们最近发布了一个新的GC引擎(我认为)符合上述所有要求。

答案 3 :(得分:0)

像这样窃取收集器的问题:垃圾收集器通常与它们所编写的语言捆绑在一起。对于功能性语言而言,优秀的收藏家往往采取与收藏家不同的行为。开源地方可能有理由偷窃:

  • ocaml的
  • 的Python
  • ...

答案 4 :(得分:0)

如果没有更好地了解您希望主持的语言,这显然很难回答,但您是否看过Parrot VMPDD 9: Garbage Collection Subsystem讨论了它的GC并且似乎点击了你要求的流行语,以及它所设计的语言(主要是Perl6,使用lua和强类型的javascript-ish,称为winxed,因为强秒)肯定具有破坏性的赋值和对象。

它是一个VM目标,但不是一个独立的GC。我真的怀疑你会发现一个现成的GC(除了Boehm之类的保守收藏家)与某种VM无关,因为要使它准确,需要更多关于堆栈帧的信息。反汇编可以给。

答案 5 :(得分:0)

Azul垃圾收集器是专有的,但有足够的有关其算法的信息,您应该能够实现类似的内容:http://news.ycombinator.com/item?id=2022723

它肯定支持“无暂停”的收集,尽管这样做的复杂性是人们通常不这样做的好迹象。