D编程语言是否使用增量垃圾回收器?

12

垃圾收集器页面没有说明D语言使用的是增量式垃圾收集器还是全停顿垃圾收集器。它确实几次提到了暂停,这可能是全停顿垃圾收集器的暗示,但我不确定。

如果它不使用增量式垃圾收集器,是否有什么特定原因?全停顿垃圾收集器对于交互式应用程序来说很麻烦。

1个回答

13

目前的实现 (Druntime) 使用停止-全局垃圾回收器(stop-the-world garbage collector),但语言本身对实现的细节没有太多限制。

D语言有一个针对*nix类操作系统的并发垃圾回收器(CDGC)(它使用分叉)。

增量式垃圾回收在编译环境中很难使用,因为需要写入屏障(write barriers)。虚拟机可以跟踪引用,但是系统语言,比如可以调用memcpy和类似函数的语言则不能。


嗨,各位Haunter粉丝(是的,我的头像受到了Haunter的启发)!话说,为什么增量垃圾收集器需要写屏障呢? - orlp
6
“增量垃圾收集”通常意味着允许应用程序代码在堆扫描开始和结束之间运行。如果垃圾收集器无法找到对象的任何引用,则将其视为垃圾并进行回收...问题发生在GC扫描内存块A时,然后应用程序代码将唯一的对象引用从块B移动到A,然后GC扫描块B。如果GC未注意到在扫描后修改了块A,则它将永远看不到该对象的任何引用并将其丢弃。 - Vladimir Panteleev
这是错误的,应用程序代码不一定需要写屏障。它需要访问MMU来跟踪内存写入 - 在Windows上,我们有一个内存写入监视API。这并不神奇,也不是很困难。 - Lothar
我并没有说写屏障需要在应用程序代码中实现 - 它们可以通过应用MMU来实现,就像你所说的那样(使用页面保护、Get/ResetWriteWatch等)。然而,这些并不能神奇地使问题变得微不足道 - 否则我们早就已经看到了D语言的增量/分代GC。 (既然你这么快就指出我的错误,并吹嘘这个问题有多容易,那么你的增量/分代GC实现在哪里?我实际上尝试过编写一个。) - Vladimir Panteleev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接