d改进垃集的可能方向
原文
也许,D的GC
应该正式公开一个互斥锁
,当它运行时,你可同步
它.所以可在JNI
桥或其他地方合作.可能值得考虑.听说C#
类似.
GC
停止线程原因是,确保
分析过程中不变化.
如,GC
扫描0-1000
地址时,没有发现,然后运行中的线程
引用一个
从2200
内存地址下移
到800
地址,而GC
正在扫描1000-2000
地址.
然后GC
扫描2000-3000
,对象
曾经在那里,但现在不丰.GC
不知道它需要再次扫描800
地址.它从未
见过该对象
,认为该对象
死了,并释放
了它.
然后,线程
使用对象,并崩溃
.
当前实现通过停止
所有线程来避免
.
但是,停止一切需要:
1
)GC
知道有哪些线程,并停止它们.
2
)这是大材小用!真正要做的是,像示例
那样,在运行时
阻止可能改变GC
分析的操作
.不需要停止数值
工作,它不会改变GC
.不必停止读取
指针(有些确实
需要停止),所以也不必停止它们.
由于GC
关心的是指针位置
,因此可用叫写障
的东西专门勾挂
它;或阻塞
指针写入,或至少通知GC
(.顺便,不必阻塞
所有写入指针,只阻塞
不同内存块
的写指针.所以可继续切片迭代
等.更多细节).
那么接着:
GC
扫描0-1000
地址,未发现内容.
然后运行中的线程
引用从2200
内存地址下移到800
地址.然后触发写障
.在GC
完成之前,禁止
线程完成该操作.注意GC
不必提前
知道该线程,因为由运行中
线程负责传达意图给GC
.(GC
持有互斥锁
,在生成D代码
中,在该互斥锁
上,要求同步
所有指针写入
,但实现方式多种多样
.)
然后GC
扫描2000-3000
,对象
仍在那里,因为暂停写了!它没有释放它.
GC
完成了它的工作
,释放了写碍
.现在恢复
线程并移动
,对象
仍然活着,没有崩溃.
这将是并发GC
,不会停止正在执行自包含
工作的线程
,也将与外部
线程更兼容
,因为无论是什么线程,它都要使用gc
互斥锁屏障
.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现