golang gc
题目来源: 字节跳动,深信服,米哈游
答案1:
- 对【40. go的GC(标记清理 -> 三色标记发 -> 混合写屏障)】补充:
Q: 那如果用户在并发CMS期间改了引用,写屏障如何保证三色不变性:
A: 插入屏障和删除屏障共同保证
插入写屏障:对象A引用C,A黑C白,会把C加入写屏障buf,最终flush到扫描队列。
删除屏障:被删除的对象,如果自身为灰色或者白色,那么被标记为灰色。(保护灰色到白色的路径不会断)。
插⼊写屏障和删除写屏障的短板:
插⼊写屏障:结束时需要STW来重新扫描栈,标记栈上引⽤的⽩⾊对象的存活;
删除写屏障:回收精度低,GC开始时STW扫描堆栈来记录初始快照,这个过程会保护开始时刻的所有存活对象。