Golang垃圾回收

  • 回收算法 (golang < 1.25 , 1.25+ 引入了green tea算法)
    三色标记-清除算法
  • 回收过程
    触发GC后,将全部对象标记为白色。
    第一阶段,短暂暂停程序,将根对象(全局对象,协程栈等)标记为灰色,同时开启写屏障。
    
    第二阶段,恢复程序运行,并发地继续标记工作,这个阶段用户程序与后台标记同时运行。标记过程是,递归扫描灰色对象,将灰色对象引用的白色对象标记为灰色,而灰色对象自身标记为黑色,直到所有灰色对象完成变色,最后剩下黑色和白色对象,黑色对象是活跃对象,白色对象是潜在垃圾。
    
    第三阶段,短暂暂停程序,确保所有灰色对象完成标记和转换。
    
    注意事项:
        - 标记完成不代表立刻清除所有垃圾,清除操作是独立且并发的,与用户程序并发运行,逐步完成清除,不会导致程序暂停。
        - 写屏障:在并发标记时,如果发生新旧对象交替,将新旧对象都标记为灰色对象,使新旧对象在后续会被扫描标记,防止标记出错。
  • 触发时机
    堆内存触发:当内存达到上次gc后仍存活内存的2倍时,会触发gc。默认是2倍时触发,可以通过调整GOGC(默认是100)来改变[计算公式:上次GC后存活堆内存 * (1+GOGC/100)]。
    定时触发: 默认2分钟内没发生gc时,系统监控线程会强制启动一次gc。
    大对象分配触发: 分配超过32kb的大对象时,监控线程会检查堆状态,如果满足条件就触发gc。
    手动触发: 用户可以主动调用runtime.GC()主动触发gc。

     

posted @ 2025-08-26 15:33  CJTARRR  阅读(45)  评论(0)    收藏  举报