MST

星途 面试题库

面试题:Go协程内存管理与垃圾回收的协同

Go的垃圾回收(GC)机制如何与协程的内存管理协同工作?当一个协程持有对某个对象的引用,但该协程处于阻塞状态时,GC如何处理相关内存?
32.7万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

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