D 编程/垃圾回收器
外观
< 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()
- 标记阶段
- 扫描所有线程的栈
- 扫描根(全局变量)
- 扫描范围(非 GC 管理的内存,其中也可能包含对 GC 对象的引用)
- 完成所有收集的对象
- 清除未使用的内存