面试题答案
一键面试- Go的垃圾回收(GC)机制与协程内存管理的协同工作
- 标记阶段:
- Go的GC采用三色标记法。在标记阶段,GC从根对象(如全局变量、栈上的变量等)开始遍历,将可达对象标记为灰色。
- 协程栈也被视为根对象集合的一部分。GC会扫描协程栈上的变量,找出其引用的对象并标记为灰色。这确保了即使协程正在运行或阻塞,只要栈上有对对象的引用,该对象就被视为可达,不会被回收。
- 清除阶段:
- 标记完成后,所有白色对象(不可达对象)会被回收。而协程栈上引用的对象,只要在标记阶段被标记为可达(灰色后来变为黑色),就不会在清除阶段被回收。
- 标记阶段:
- 当协程持有对某个对象的引用且处于阻塞状态时GC的处理方式
- 对象可达性:因为协程栈上有对该对象的引用,在GC的标记阶段,从协程栈根出发可以访问到该对象,所以该对象会被标记为可达(灰色进而变为黑色)。
- 内存不会回收:即使协程处于阻塞状态,只要其栈上对该对象的引用存在,GC就不会回收该对象所占用的内存。只有当协程结束,其栈被销毁,不再有对该对象的引用,在下一次GC循环中,该对象才可能因为不可达而被回收。