在Go源代码的文件runtime/proc.go中,有许多注释涉及安全点函数,它们似乎与垃圾收集安全的时间点相关.但是,我找不到这些功能的任何定义.
什么是安全点功能,它们用于什么,以及这些功能的一些示例是什么?
这是我能在这个主题上挖掘到的所有内容。
我在这里找到了一些关于 Go GC 安全点的讨论。
看起来安全点(在 Go 实现中使用)实际上与安全点的传统定义相同:
GC 可以跟踪所有变量和寄存器所保存内容的关键点
同一线程上的另一个用户提到 GC
在函数序言期间将抢占点折叠到堆栈检查中
该声明的来源如下:https://github.com/golang/go/issues/10958
根据golang-dev 邮件列表上的这篇文章,安全点也称为“调用站点”。
为了深入了解 Go 安全点的本质,我认为了解 GC 的演变很重要。这篇文章 提到了以下内容:
在 Go 1.5 之前,Go 使用并行停止世界(STW)收集器。
Go 1.5 引入了并发收集器。
该问题的另一个答案提到:
从 Go 1.7 开始,无限且可能不平凡的停止世界(STW)时间的剩余来源之一是堆栈重新扫描。
从 1.8 开始,最坏情况下的世界停止时间似乎已经得到了改善。
另外,这里是 Go 垃圾收集器的当前实现。如果您仔细阅读注释,您会发现它是一个非分代标记清除收集器。您可以在这里阅读更多相关信息:https://blog.plan99.net/modern-garbage-collection-911ef4f8bd8e#.udz1kjk3b
最后,这是 Gil Tene 在 golang-dev 邮件列表上发表的一篇旧帖子,它鼓励使用移动垃圾收集器。他声称(当时是 2012 年)Go 使用的是“保守的、非重定位的收集器”,并且他讨论了允许长时间运行垃圾收集器的安全点的特征。
虽然 Go 的垃圾收集器已经摆脱了长时间的暂停,现在是一个“并发、三色、标记-清除收集器”,但它仍然是一个非分代 GC。看起来 Go 的 GC 是建立在 70 年代的 GC 思想之上的,而不是现代的企业方法。
看起来 Go 的安全点概念更符合传统的安全点概念,而不是具有允许分代垃圾收集的现代品质的安全点。
| 归档时间: |
|
| 查看次数: |
607 次 |
| 最近记录: |