【问题标题】:Is there a garbage collection algorithm that meets these requirements?是否有满足这些要求的垃圾回收算法?
【发布时间】:2011-02-01 13:47:55
【问题描述】:

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

  • 开源并记录在案,以便我实施。
  • 准确
  • 通用
  • 全局,即每个进程只有一个收集器,而不是每个线程一个。
  • 增量和/或并发,以避免主要收集长时间停顿。
  • 适合这种编程范式。一个例子是收集器在存在破坏性分配时变得非常慢。

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

【问题讨论】:

  • 如果您面向 .NET 或 Java 平台,您将免费获得一个。
  • 这是一个关于垃圾收集的非常好的series of articles
  • @Henk,他在写一个编译器
  • @Thomas 编译器可以针对 .NET 或 Java 平台
  • 这里实现了一些:jikesrvm.org

标签: algorithm compiler-construction garbage-collection


【解决方案1】:

有一种完全不是实验性的垃圾收集算法实际上可以满足您的所有要求:简单的自动引用计数。总的来说,引用计数作为一个可行的选择确实没有得到足够的信任,但实际上它在许多情况下都非常有效,从来没有任何大批量延迟,也不需要复杂的魔法。

一个问题仍然是清理循环引用,你至少可以让它在极少情况下完成;关心速度的应用开发者可以在需要对象离开时明确地打破循环。

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

对于大量多线程的系统来说,引用计数不是很有效,因为每次触摸引用计数时都需要获取锁。但是,如果您无论如何都在设计一种新语言,那么您可以做一件大事来提高整个语言的性能和可靠性:防止几乎所有对象在线程之间共享。 IE。明确分享。如果这样做,您将知道哪些对象是共享的,哪些是不共享的,因此在增加/减少引用计数时需要锁定哪些对象,哪些可以保持解锁状态。在没有任何锁定的情况下,引用计数性能非常出色。

【讨论】:

    【解决方案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 Scholar,并通过查找标题来查看是否有更多最新的跟进然后点击“被引用”链接,例如:

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

    (由于您有这么多的要求,您可能需要亲吻很多青蛙才能找到您的即时收藏家。)

    【讨论】:

      【解决方案3】:

      您可能会从 mono 中窃取垃圾收集器,mono 是 .Net 的开源实现。他们最近发布了一个(我认为)满足上述所有要求的新 GC 引擎。

      【讨论】:

      • 经过一番研究,我发现Mono的新collector是stop-the-world,所以不符合要求。
      【解决方案4】:

      像这样窃取收集器的问题:垃圾收集器通常与编写它们的语言相关联。函数式语言的优秀收集器的行为往往与命令式语言的收集器不同。开源的地方可能有理由窃取:

      • 单声道
      • Ocaml
      • Python
      • ...

      【讨论】:

        【解决方案5】:

        如果不更好地了解您希望托管的语言,这(显然)很难回答,但您看过Parrot VM 吗? PDD 9: Garbage Collection Subsystem 讨论了它的 GC 并且似乎达到了您要求的流行语,并且它设计的语言(主要是 Perl6,使用 lua 和一个强类型的 javascript-ish 东西,称为 winxed 作为强秒)肯定具有破坏性分配和对象。

        不过,它是一个 VM 目标,而不是一个独立的 GC。我真的怀疑你会找到一个与某种 VM 无关的现成 GC(除了像 Boehm 这样的保守收集器),因为要使其准确需要有关堆栈帧的更多信息而不是反汇编可以给。

        【讨论】:

          【解决方案6】:

          Azul Garbage Collector 是专有的,但有足够的关于他们算法的可用信息,您应该能够实现类似的东西:http://news.ycombinator.com/item?id=2022723

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

          【讨论】:

            猜你喜欢
            • 2019-09-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多