【问题标题】:Does the D programming language use an incremental garbage collector?D 编程语言是否使用增量垃圾收集器?
【发布时间】:2012-03-26 14:03:10
【问题描述】:

page on the garbage collector 没有指定 D 是使用增量垃圾收集器还是使用 stop-the-world 版本。它确实提到了 pausing 几次,这可能暗示了一个 stop-the-world 垃圾收集器,但我不确定。

如果它不使用增量垃圾收集器,有什么特别的原因吗? stop-the-world GC 给交互式应用程序带来了困难。

【问题讨论】:

    标签: garbage-collection d


    【解决方案1】:

    当前的实现 (Druntime) 使用 stop-the-world 垃圾收集器,但语言本身并没有对实现的细节施加太多限制。

    D 有一个并发垃圾收集器CDGC,用于*nix-like 操作系统(它使用分叉)。

    增量 GC 很难在编译环境中使用,因为需要写屏障。 VM 可以跟踪引用,但是可以调用 memcpy 和类似函数的系统语言不能。

    【讨论】:

    • 你好,Haunter 的粉丝(是的,我的头像是受到 Haunter 的启发)!也就是说,为什么增量垃圾收集器需要写屏障?
    • “增量垃圾回收”通常意味着允许应用程序代码在堆扫描开始和结束的点之间运行。如果 GC 找不到对它的任何引用,则该对象被视为垃圾并被收集......当 GC 扫描内存块 A 时会出现问题,然后应用程序代码将对对象的唯一引用从块 B 移动到 A,并且然后 GC 扫描块 B。如果 GC 在扫描后没有注意到块 A 被修改,它将永远不会看到对该对象的任何引用,并丢弃它。
    • 这是错误的,它不一定需要在应用程序代码中写屏障。它需要访问 MMU 来跟踪内存写入——在 Windows 上,我们有一个内存写入监视 API。这不是魔术,也不是很困难。
    • 我没有说写屏障需要在应用程序代码中——它们可以通过应用 MMU 来实现,正如你所说(使用页面保护,Get/ResetWriteWatch,你有什么)。然而,这些并没有神奇地使问题变得微不足道——否则我们已经看到了 D 的增量/分代 GC。 (既然你这么快就说我错了,并夸耀这个问题有多简单,那么你的增量/分代 GC 实现在哪里呢?我实际上已经尝试过编写一个。)
    猜你喜欢
    • 2012-11-14
    • 2011-10-29
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 2010-12-17
    相关资源
    最近更新 更多