面试题答案
一键面试- 标记 - 清除算法基础:
- Go语言的垃圾回收器(GC)采用三色标记 - 清除算法。在这个算法中,对象被分为三种颜色:白色、灰色和黑色。
- 白色:代表尚未被垃圾回收器访问到的对象。在垃圾回收过程结束时,白色对象会被回收。
- 灰色:代表已经被垃圾回收器访问到,但它的子对象还没有被全部访问的对象。
- 黑色:代表已经被垃圾回收器访问到,并且它的所有子对象也都被访问过的对象。
- 检测循环引用:
- 在标记阶段,垃圾回收器从根对象(如全局变量、栈上的变量等)开始,将所有可达对象染成灰色。
- 接着,垃圾回收器不断从灰色对象队列中取出对象,将其染成黑色,并将其引用的对象染成灰色。
- 这个过程会持续进行,直到灰色对象队列为空。此时,所有可达对象都已经被染成黑色,而白色对象就是不可达对象,其中可能包含循环引用的对象。
- 例如,假设有两个对象A和B,A引用B,B引用A,形成循环引用。在标记过程中,如果没有从根对象可达这两个对象,那么A和B最终都会保持白色,被判定为不可达对象。
- 处理循环引用对象:
- 在清除阶段,垃圾回收器会扫描堆内存,回收所有白色对象所占用的内存空间。对于循环引用的白色对象,它们所占用的内存同样会被回收。
- 因为Go语言的垃圾回收器基于可达性分析,只要对象从根对象不可达,无论是否存在循环引用,都会被判定为垃圾对象并回收其内存,从而确保内存被正确回收。