Golang 底层原理剖析笔记-垃圾回收

常见垃圾回收策略

在这里插入图片描述

Golang 垃圾回收标记策略

内存分配 : TCmalloc 算法
标记:三色标记,
辅助清扫:大对象或者 mcentral 申请内存时,会触发辅助清扫的机制,若清扫 span 小于目标 span 树,会协助进行辅助清除。
清楚系统主流内存:单独清扫协程,定期进行,维持在占 CPU 1% 时间。
删除机制:span 为单位,1.5 后有辅助清扫的机制
理论: 不基于分代
是否并发:是,1.5 后可与用户协程一起并发

为什么不采用分代思路

  • go 作为编译型语言,编译阶段通过内存逃逸分析会将继续使用的对象分配到堆上,大部分短对象在栈中分配。
  • go 是基于协程的,协程栈可以充分用来代表 分代理论 中的年轻代,并且会自动被回收。
  • 分代 GC 需要屏障维护对象声明周期的年代和位置。
  • 为了简单性,后续可能会逐步增加更好的回收算法。

触发机制

  1. 内存申请时如果大于上一次gc中活跃内存的 2 倍(默认值:debug.SetGCPercent 可修改)
  2. 定时:每隔 2min
  3. 主动触发:runtime.GC

主要流程

在这里插入图片描述
标记准本:STW
并行标记:可能产生引用的变化,通过写屏障记录在 bitmap 中,结合三色标记法的增量更新或者原始快照来重新扫描。
标记终止:STW,做统计工作
垃圾清扫:唤醒垃圾清扫进程,清理 span。
清扫系统驻留内存:单独的协程定期清扫,只有一个。
辅助清扫:当像 mcentrel申请内存和大对象分配时判断已经清理的 page 数量是否到达目标清理 page 数量,不够的话任务协程会陷入清扫逻辑。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值