垃圾回收(Garbage Collection,简称GC)是编程语言中提供的自动的内存管理机制,自动释放不需要的对象,让出存储器资源,无需程序员手动执行。
GOLANG的垃圾回收机制
现在go1.14所用的是三色标志法和GC混合写屏障,GC过程和其他用户goroutine可并发运行,但需要一定时间的STW(stop the world),STW的过程中,CPU不执行用户代码,全部用于垃圾回收
GC版本变化
Go V1.3 标记清除(mark and sweep)
Go V1.5 三色标记法
Go V1.8 加入混合写屏障
Go V1.3的标记清除
标记清除的流程
- 触发GC,暂停程序业务逻辑(STW),找出可达对象和不可达对象
如图所示,箭头表示引用关系,1,2,3,4,7这五个对象就是可达对象,5和6这两个对象就是不可达对象 - 开始标记,找到它所有的可达对象,并做上标记,如上图中的红色对象部分。
- 完成标记,开始清除未标记的对象
- 完成清除,停止暂停,然后循环重复以上四步,直到该程序进程生命周期结束
整个流程的图示:
问题:触发GC的条件是什么
标记清除的缺点
- 存在STW。因为在GC阶段需要暂停整个程序,程序出现卡顿,严重影响性能(最重要的 )
- 标记过程需要扫描整个heap和stack(堆栈信息),无疑是加长了整个STW的持续时间,还是影响性能的问题
- 清除数据会产生heap碎片,也就是产生一些不连续的碎片内存空间,对后续的重用,重组增加了困难