我需要爲支持併發的解釋器編寫垃圾回收器,但我只能找到有關垃圾回收的信息,而沒有任何與併發有關的信息。在併發系統中執行垃圾收集的可能方法是什麼?
是否有多線程系統中垃圾收集對象的具體方法?我在哪裏可以找到有關其架構和實施的信息?
我需要爲支持併發的解釋器編寫垃圾回收器,但我只能找到有關垃圾回收的信息,而沒有任何與併發有關的信息。在併發系統中執行垃圾收集的可能方法是什麼?
是否有多線程系統中垃圾收集對象的具體方法?我在哪裏可以找到有關其架構和實施的信息?
也許我只是不理解這個好......但是併發性與一個對象的引用有多少有關係嗎?它要麼有生命的引用,要麼沒有;多線程對此沒有影響。
我可能看到可能需要分別追蹤每個線程以查看哪些引用是否存在。但是,這應該只是多次應用單線程跟蹤。
另外,爲什麼不直接在一個已經完成所有這些的虛擬機上編譯你的解釋器呢?像JRuby(Java VM)或IronPython(.NET)所做的一樣。
併發垃圾收集實際上是很難得到正確的。然而,研究併發垃圾收集算法。
馬克&掃描:http://doc.cat-v.org/inferno/concurrent_gc/
馬克&掃描(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是這樣做的。
使用併發垃圾收集器。有關詳細信息,請參閱Garbage Collection Handbook第15章「併發垃圾收集」。 .NET和JVM這樣做。您需要一個寫屏障(Dijkstra,Steele或Yuasa),以便在收集器運行時記錄堆拓撲的變化。
併發垃圾收集範圍從完全併發(沒有停頓)大多併發(部分空頭止損的世界停頓,通常得到全球根的自洽的快照)。就吞吐量而言,完全併發是代價高昂的,因爲保持GC通知不斷變化的堆拓撲需要細粒度的同步。像美麗的Very Concurrent Garbage Collector(VCGC)這樣的收集器可以實現粗粒度同步。 FWIW,我爲F#.NET Journal編寫了一個article about a VCGC implementation in F#。
不同的線程可能引用同一個對象;如果我不想在執行GC時停止所有線程,我有什麼選擇? (如果我不停止所有線程,如何判斷是否存在對某個對象的實時引用?一個線程可能會在另一個線程獲取引用後立即釋放該對象)。 – josh 2010-10-07 22:25:49
關於虛擬機:我會有一個自定義的虛擬機(如果一切順利的話,使用我自己的JIT編譯技術)... – josh 2010-10-07 22:28:50
@josh我明白了。你是個瘋子。但玩得開心! – jdmichal 2010-10-07 22:43:06