GC触发的条件
v1.3版本 标记清除法
第一步,找出不可达的对象,做上标记。
第二部,回收没有被标记的对象。
缺点:在标记的时候会进行STW(Stop the world)
Stop the world
- 设置gcwaiting=1,这个在每一个G任务之前会检查一次这个状态,如是,则会将当前M 休眠;
- 如果这个M里面正在运行一个长时间的G任务,咋办呢,难道会等待这个G任务自己切换吗?这样的话可要等10ms啊,不能等!坚决不能等! 所以会主动发出抢占标记(类似于上一篇),让当前G任务中断,再运行下一个G任务的时候,就会走到第1步
- 一直等待所有的M进入休眠,此时所有的业务逻辑代码都停止
v1.5版本 三色标记法
优化的点:Golang三色标记法中最后只剩下的黑白两种对象,黑色对象是程序恢复后接着使用的对象,如果不碰触黑色对象,只清除白色的对象,肯定不会影响程序逻辑。所以: 清除操作和用户逻辑可以并发。
v1.8版本 混合写屏障机制(hybrid write barrier)
该屏障之前的写操作和之后的写操作相比,先被系统其它组件感知。 通俗的讲:就是在gc跑的过程中,可以监控对象的内存修改,并对对象进行重新标记。(实际上也是超短暂的stw,然后对对象进行标记)
总结:创建对象还是对象的引用改变,都会先变为灰色
优化的点:标记操作和用户逻辑也是并发的,用户逻辑会时常生成对象或者改变对象的引用,那么标记和用户逻辑如何并发呢?因为用户逻辑在会存在创建新的对象和改变对象引用的情况,所以 写屏障机制会把新的对象都会先变为灰色。
Original: https://www.cnblogs.com/xiaofua/p/15950907.html
Author: 小傅啊
Title: Golang的GC回收机制
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/516424/
转载文章受原作者版权保护。转载请注明原作者出处!