请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

三色标记法,灰色的问题

老师,垃圾回收的时候,
引入灰色,是为了记录当前的刚刚被扫描的对象,然后进行下一层的查找,起到一个追踪的作用,
因为不递归的查找,所以需要记录当前扫描的对象,对不

如果面试问我:
一次GC是从根节点开始的,
然后就算不递归查找,也会扫描全部,
那这个灰色有啥意义吗?直接递归扫描不是更简单吗?

这样回答可以不:
因为可能有对象会形成环,所以一般会采用三色标记法

正在回答

1回答

Golang中的三色标记法是一种非递归的垃圾回收算法来标记和清除不再使用的内存对象。

算法从根对象(例如全局变量和栈上的变量)开始,将所有根对象标记为灰色。然后,逐步处理所有灰色对象,将其子对象(即引用的其他对象)标记为灰色,并将已处理的对象标记为黑色。当没有灰色对象时,算法完成,此时所有白色对象都是不可达的,可以被回收。

Go 语言的垃圾回收器并非递归地查找对象。它使用一个队列来存储灰色对象,并通过队列的先进先出(FIFO)原则来处理这些对象。这样可以避免递归导致的栈溢出问题,特别是在处理大型对象图时。

Go 语言的垃圾回收器还具有并发性。在标记阶段,它可以与程序的其他部分并发运行,而不会导致程序完全暂停。为了实现这一点,Go 语言的垃圾回收器使用了写屏障(write barrier)技术,以确保在并发标记过程中不会丢失任何引用。

1 回复 有任何疑惑可以回复我~
  • 提问者 博楠 #1
    非常感谢!
    回复 有任何疑惑可以回复我~ 2023-11-22 10:40:42
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信