2012-03-26 58 views

回答

13

当前实现(Druntime)使用停止在世界的垃圾收集,但语言本身并没有把很多的限制上实现的细节。

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

由于需要编写屏障,增量GC很难在编译环境中使用。虚拟机可以跟踪参考,但系统语言可以调用memcpy和类似的函数,但不能。

+0

嗨那里的哈恩特粉丝(是的,我的化身是哈恩特的灵感)!那就是说,为什么增量垃圾收集器需要编写屏障? – orlp 2012-03-26 14:13:22

+6

“增量垃圾回收”通常意味着应用程序代码允许在堆扫描开始和结束时在点之间运行。如果GC无法找到对其的任何引用,则会将对象视为垃圾并收集...当GC扫描内存块A时出现问题,然后应用程序代码将唯一对象从块B引用到A,并且那么GC扫描块B.如果GC没有注意到块A在扫描后被修改,它将永远不会看到对该对象的任何引用,并丢弃它。 – 2012-03-26 18:19:59

+0

这是错误的,它不一定需要在应用程序代码中写入屏障。它需要访问MMU来跟踪内存写入 - 在Windows上我们有一个内存写入观察API。这不是魔术,也不是很难。 – Lothar 2014-07-04 00:05:33