在并发系统中进行垃圾收集的可能方法有哪些?

时间:2010-10-07 22:07:50

标签: concurrency garbage-collection language-implementation

我需要为支持并发的解释器编写一个垃圾收集器,但我只能找到有关垃圾收集的信息,而不需要与并发有任何关系。

是否存在多线程系统中对象的垃圾收集的特定方法?我在哪里可以找到有关其架构和实施的信息?

3 个答案:

答案 0 :(得分:1)

并发垃圾收集实际上要做得更加棘手。然而,已经对并发垃圾收集算法进行了研究。

Mark&扫一扫:http://doc.cat-v.org/inferno/concurrent_gc/

Mark&扫描(PDF警告):http://www.win.tue.nl/~jfg/articles/CSR-04-31.pdf

分代复制:https://labs.oracle.com/techrep/2000/abstract-88.html

分代复制:http://chaoticjava.com/posts/parallel-and-concurrent-garbage-collectors/

困难在于同步线程,因此堆不会处于不一致(无效)状态。

答案 1 :(得分:0)

也许我只是不理解这一点......但并发性与对象的引用数量有多少有关?它既有生活参考,也没有;多线程对此没有影响。

我可以看到可能需要分别追踪每个线程以查看哪些引用是否存在。但这应该只是多次应用单线程跟踪。

另外,为什么不在已经完成所有这些操作的VM之上编写解释器呢?就像JRuby(Java VM)或IronPython(.NET)一样。

答案 2 :(得分:0)

  

是否存在多线程系统中对象的垃圾收集的特定方法?我在哪里可以找到有关其架构和实施的信息?

主要有两种解决方案:

  1. 当从一个线程传递到另一个线程时,通过深度复制值来禁止变异并利用所产生的单向堆中的引用透明性。然后使用非并发收集。 Erlang这样做。

  2. 使用并发垃圾收集器。有关详细信息,请参阅Garbage Collection Handbook第15章“并发垃圾收集”。 .NET和JVM就是这样做的。您需要一个写屏障(Dijkstra,Steele或Yuasa),以便在收集器运行时记录堆拓扑的突变。

  3. 并发垃圾收集器的范围从完全并发(无暂停)到大多数并发(一些短暂的世界停顿,通常是为了获得全局根的自洽快照)。完全并发在吞吐量方面成本很高,因为保持GC了解不断变化的堆拓扑需要细粒度的同步。像美丽的Very Concurrent Garbage Collector(VCGC)这样的收集器可以实现粗粒度同步。 FWIW,我为F#.NET Journal写了article about a VCGC implementation in F#