Go   发布时间:2022-04-13  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Golang的GC回收机制大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

Golang的GC回收机制

GC触发的条件

  • 阈值:默认内存扩大一倍,启动gc

  • 定期:默认2min触发一次gc,src/runtime/proc.go:forcegcperiod

  • 手动:runtime.gc()

v1.3版本 标记清除法

第一步,找出不可达的对象,做上标记。

第二部,回收没有被标记的对象。

缺点:在标记的时候会进行STW(Stop the world)

Stop the world

  1. 设置gcwaiTing=1,这个在每一个G任务之前会检查一次这个状态,如是,则会将当前M 休眠;

  2. 如果这个M里面正在运行一个长时间的G任务,咋办呢,难道会等待这个G任务自己切换吗?这样的话可要等10ms啊,不能等!坚决不能等! 所以会主动发出抢占标记(类似于上一篇),让当前G任务中断,再运行下一个G任务的时候,就会走到第1步

  3. 一直等待所有的M进入休眠,此时所有的业务逻辑代码都停止

v1.5版本 三色标记法

  1. 启动STW

  2. 新创建的对象默认颜色是白色

  3. GC回收从根节点一次遍历所有对象,把遍历到的对象从白色集合放入灰色集合。

  4. 循环遍历灰色集合,将灰色对象引用的对象从白色集合放入灰色集合,之后将此灰色对象放入黑色集合,直到灰色中无任何对象

  5. 停止STW

  6. 回收所有的白色标记表的对象.也就是回收没有被引用的对象(垃圾)。

优化的点:Golang三色标记法中最后只剩下的黑白两种对象,黑色对象是程序恢复后接着使用的对象,如果不碰触黑色对象,只清除白色的对象,肯定不会影响程序逻辑。所以: 清除操作和用户逻辑可以并发。

v1.8版本 混合写屏障机制(hybrid write barrier)

写屏障

该屏障之前的写操作和之后的写操作相比,先被系统其它组件感知。 通俗的讲:就是在gc跑的过程中,可以监控对象的内存修改,并对对象进行重新标记。(实际上也是超短暂的stw,然后对对象进行标记)

总结:创建对象还是对象的引用改变,都会先变为灰色

步骤

  1. 扫描栈中内存对象全部标记黑色,对新增加的对象标记为黑色

  2. 扫描堆中的全部对象,把遍历到的对象从白色集合放入灰色集合。

  3. 循环遍历灰色集合,将灰色对象引用的对象从白色集合放入灰色集合,之后将此灰色对象放入黑色集合,直到灰色中无任何对象,对重新引用的对象标记为灰色,对被添加的对象标记为灰色。

  4. 回收所有的白色标记表的对象.也就是回收垃圾。

优化的点:标记操作和用户逻辑也是并发的,用户逻辑会时常生成对象或者改变对象的引用,那么标记和用户逻辑如何并发呢?因为用户逻辑在会存在创建新的对象和改变对象引用的情况,所以写屏障机制会把新的对象都会先变为灰色。

大佬总结

以上是大佬教程为你收集整理的Golang的GC回收机制全部内容,希望文章能够帮你解决Golang的GC回收机制所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: