当前位置: 首页 > news >正文

GO GC

GO GC

垃圾回收(Garbage Collection,简称GC)是编程语言中提供的自动的内存管理机制,自动释放不需要的对象,让出存储器资源,无需程序员手动执行。

Golang中的垃圾回收主要应用三色标记法,GC过程和其他用户goroutine可并发运行,但需要一定时间的STW(stop the world),STW的过程中,CPU不执行用户代码,全部用于垃圾回收。

Go1.3采用标记清除法, Go1.5采用三色标记法,Go1.8采用三色标记法+混合写屏障。

标记清除法(mark and sweep)

  • 分为两个阶段:标记和清除

  • 标记阶段:从根对象出发寻找并标记所有存活的对象。

  • 清除阶段:遍历堆中的对象,回收未标记的对象,并加入空闲链表。

  • 缺点:

    • 需要暂停程序(STW)
    • 标记需要扫描整个堆
    • 清除数据会产生堆碎片

三色标记法

  • 将对象标记为白色,灰色或黑色。

  • 白色:不确定对象(默认色);黑色:存活对象。灰色:存活对象,子对象待处理。

  1. 将所有对象加入白色集合
  2. 从根节点开始遍历所有对象,把遍历到的对象从白色集合放入灰色集合
  3. 遍历灰色集合,将灰色对象引用的对象从白色集合放入灰色集合,之后将此灰色对象放入黑色集合
  4. 重复第三步, 直到灰色中无任何对象
  5. 回收白色集合所有的对象
  • 缺点:对象的引用被用户修改了,那么之前的标记就无效
    • 条件1: 一个白色对象被黑色对象引用(白色被挂在黑色下)
    • 条件2: 灰色对象与它引用的白色对象遭到破坏(灰色丢了该白色)
    • 当以上两个条件同时满足时, 就会出现白色对象丢失现象
    • 解决:引入屏障机制

屏障机制

  1. “强-弱” 三色不变式

    • 强三色不变式:不存在黑色对象引用到白色对象的指针
    • 弱三色不变式:所有被黑色对象引用的白色对象都处于灰色保护状态
  2. 插入写屏障

    • 操作:在A对象引用B对象的时候,B对象被标记为灰色
    • 满足:强三色不变式。
    • 注意:在栈空间的对象操作中不使用,仅使用在堆空间对象的操作中
    • 缺点:对栈重新进行三色标记扫描需要STW,直到栈空间的三色标记结束
  3. 删除写屏障

    • 操作:被删除的对象,如果自身为灰色或白色,那么被标记为灰色
    • 满足:强三色不变式
    • 缺点:回收精度低,一个对象即使被删除了最后一个指向它的指针仍可以活过这一轮
  4. 完整的GC分为四个阶段

    • 准备标记(开启STW),开启写屏障。
    • 开始标记
    • 标记结束(停止STW),关闭写屏障
    • 清理(并发)

混合写屏障

  • 解决写屏障问题
  • 注:不在栈上应用,因为要保证栈的运行效率
  1. GC开始:将栈上的对象全部扫描并标记为黑色(之后不再进行第二次重复扫描,无需STW)
  2. GC期间:在栈上创建的新对象标记为黑色、被删除的对象标记为灰色、被添加的对象标记为灰色

总结

  • GoV1.3- 普通标记清除法,整体过程需要启动STW,效率极低。

  • GoV1.5- 三色标记法, 堆空间启动写屏障,栈空间不启动,全部扫描之后,需要重新扫描一次栈(需要STW),效率普通

  • GoV1.8-三色标记法,混合写屏障机制, 栈空间不启动,堆空间启动。整个过程几乎不需要STW,效率较高。

参考文章:Golang 垃圾回收

http://www.lryc.cn/news/140141.html

相关文章:

  • ECharts配合Node.js爬虫实现数据可视化
  • [Linux] C获取键盘,鼠标数据
  • 户外跑步用什么耳机、户外运动耳机推荐
  • ubuntu设置系统代理
  • java定时任务如何取消
  • gitlab 9.05 版本获取合并请求的API接口报错404是为什么
  • 微服务(多级缓存)
  • 阿里云配置MySQL-server 8.0远程登录
  • 清洁能源使用的社会发展意义
  • 针对论坛系统进行功能测试和性能测试
  • Android App的设计规范
  • paddleclas ImportError: cannot import name ‘Identity‘ from ‘paddle.nn‘
  • Debezium系列之:深入理解Debezium Server Operator和实际应用Debezium Server Operator案例详解
  • ansible批量创建crontab文件并添加到定时任务
  • 什么是 API ?
  • CSS实现内凹圆角,从而实现圆角边框
  • Spring中的自定义注解
  • 前端需要理解的设计模式知识
  • 1、攻防世界第一天
  • 分布式事务(7):SpringCloud2.0整合LCN
  • 机器学习实战14-在日本福岛核电站排放污水的背景下,核电站对人口影响的分析实践
  • 4G智慧电力物联网:建设高效智能,引领电力行业革新!
  • 安防视频监控平台EasyCVR视频集中存储平台接入RTSP设备出现离线情况的问题解决方案
  • 达梦数据库分区表介绍
  • Python爬虫库之urllib使用详解
  • SpringCloud学习笔记(八)_使用Apollo做配置中心
  • jvs-rules(规则引擎)更新:新增功能介绍
  • 消息队列的消息异常处理
  • APP上线为什么要提前部署安全产品呢?
  • SQL注入之HTTP头部注入