面试题答案
一键面试写屏障在Go语言垃圾回收机制中的基本作用
- 三色标记法辅助:Go语言垃圾回收采用三色标记法,写屏障是该算法的重要辅助机制。三色标记法将对象分为白色(未被标记)、灰色(自身被标记,但子对象未全部标记)、黑色(自身和子对象都被标记)。写屏障的作用是在对象引用关系发生变化时,确保标记过程的正确性,防止出现对象丢失(本应被回收的对象未被回收)或错误回收(不应被回收的对象被回收)的情况。
- 保证可达性分析准确性:在垃圾回收标记阶段,程序仍在运行,对象引用关系可能动态变化。写屏障通过记录这些变化,确保垃圾回收器能够准确识别所有可达对象,从而正确区分存活对象和可回收对象。
写屏障保障对象引用关系正确性的方式
- 插入写屏障:
- 原理:当一个对象(假设为A)被赋值给另一个对象(假设为B)的字段,从而创建新的引用关系时,插入写屏障将新引用的对象(A)标记为灰色。这样就保证了即使在标记过程中创建了新的引用关系,新引用的对象也会被垃圾回收器注意到并最终被标记为存活对象(如果它确实是可达的)。
- 举例:假设有对象B,原本没有指向对象A的引用,在程序运行过程中执行
B.Field = A
,插入写屏障会将A标记为灰色,确保A在后续标记过程中不会被误判为不可达。
- 删除写屏障:
- 原理:当一个对象(假设为A)的引用从另一个对象(假设为B)的字段中移除时,删除写屏障会将被移除引用的对象(A)的所有父对象(如果存在)标记为灰色。这样做是为了确保即使某个对象失去了直接引用,但如果它通过其他路径仍然可达,垃圾回收器能够重新发现它。
- 举例:原本对象B的字段指向对象A,执行
B.Field = nil
移除对A的引用,删除写屏障会将A的父对象(如果有)标记为灰色,防止A被错误地当作垃圾回收。
- 混合写屏障:
- 原理:结合了插入写屏障和删除写屏障的特点。在垃圾回收的标记阶段,对新分配的对象直接标记为黑色,减少灰色对象队列的压力,提高标记效率;对于对象引用的修改,采用类似插入写屏障的方式,将新引用的对象标记为灰色。
- 优势:在保证对象引用关系正确性的同时,提升了垃圾回收的性能,减少了垃圾回收对应用程序性能的影响。