跳转到内容

D 编程/垃圾回收器

来自维基教科书,开放的书籍,开放的世界

此页面应作为实际 GC 实现的内部机制、接口、限制等的文档。

实际实现具有以下特点

  • 保守的(与精确的和内部指针相比)
  • 停止世界(与增量式和并发式相比)
  • 标记和清除(与复制相比)
  • 非移动式(与移动式相比)

另请参见 垃圾收集

文件结构

[编辑 | 编辑源代码]
std.thread
使用实际的栈指针位置支持 GC。
/internal/gc/gc.d
GC 接口,实现的包装器。
/internal/gc/gcx.d
GC 实现
/internal/gc/gcstub.d
GC 的存根,防止链接到应用程序

为了停止世界,gc 调用 Thread.pauseAll()。Linux 上的停止机制使用信号 SIGUSR1 和 SIGUSR2。在暂停线程的情况下,信号处理程序将当前栈指针存储在 stackTop 中,因此该指针始终是最新的。

它是如何工作的

[编辑 | 编辑源代码]

GC 仅在需要分配内存且当前没有可用内存时调用。如果 gc 无法释放足够的内存,则会从系统请求新的内存。

入口点是 gcx.d fullCollect()

  1. 标记阶段
    1. 扫描所有线程的栈
    2. 扫描根(全局变量)
    3. 扫描范围(非 GC 管理的内存,其中也可能包含对 GC 对象的引用)
  2. 完成所有收集的对象
  3. 清除未使用的内存

更多信息

[编辑 | 编辑源代码]

关于更好 GC 实现的想法

华夏公益教科书