我需要为支持并发的解释器编写垃圾收集器,但我只能找到有关垃圾收集的信息,而与并发无关。
多线程系统中是否有特定的对象垃圾收集方法?我在哪里可以找到有关其架构和实施的信息?
我需要为支持并发的解释器编写垃圾收集器,但我只能找到有关垃圾收集的信息,而与并发无关。
多线程系统中是否有特定的对象垃圾收集方法?我在哪里可以找到有关其架构和实施的信息?
并发垃圾收集实际上要正确得多。然而,已经对并发垃圾收集算法进行了研究。
标记和扫描:http ://doc.cat-v.org/inferno/concurrent_gc/
Mark & Sweep(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/
困难在于同步线程,因此堆不会处于不一致(无效)状态。
多线程系统中是否有特定的对象垃圾收集方法?我在哪里可以找到有关其架构和实施的信息?
主要有两种解决方案:
当值从一个线程传递到另一个线程时,通过深度复制值来禁止突变并利用由此产生的单向堆中的引用透明性。然后使用非并发集合。Erlang 就是这样做的。
使用并发垃圾收集器。有关详细信息,请参阅垃圾收集手册第 15 章并发垃圾收集。.NET 和 JVM 执行此操作。您需要一个写屏障(Dijkstra、Steele 或 Yuasa),以便在收集器运行时记录堆拓扑的变化。
并发垃圾收集器的范围从完全并发(无暂停)到大部分并发(一些短暂的停顿,通常是为了获得全局根的自洽快照)。完全并发在吞吐量方面的成本很高,因为让 GC 了解不断变化的堆拓扑需要细粒度的同步。使用漂亮的非常并发垃圾收集器(VCGC)等收集器可以实现粗粒度同步。FWIW,我为 F#.NET Journal写了一篇关于在 F# 中实现 VCGC的文章。
也许我只是不太了解这一点......但是并发与有多少对对象的引用是活动的有什么关系?它要么有活的引用,要么没有;多个线程对此没有影响。
我可以看到可能必须分别追踪每个线程以查看哪些引用是有效的。但这应该只是多次应用单线程跟踪。
另外,为什么不在已经完成所有这些工作的虚拟机上编写解释器呢?就像 JRuby (Java VM) 或 IronPython (.NET) 所做的那样。