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

Golang——GC原理

1.垃圾回收的目的

        将未被引用到的对象销毁,回收其所占的内存空间。

2.根对象是什么

  1. 全局变量:在编译器就能确定的存在于程序整个生命周期的变量。

  2. 执行栈:每个goroutine都包含自己的执行栈,这些执行栈上包含栈上的变量及指向分配的堆内存块的地址。

  3. 寄存器:寄存器的值可能表示一个指针,参与计算的这些指针可能指向某些赋值器分配的堆内存区块。

3.GC回收的过程

GO目前采用的是三色标记法,可以将垃圾回收分为两个阶段:标记阶段和回收阶段

在标记阶段开始的时候,会将所有的对象放置到白色队列中、

之后,从根对象出发扫描所有被引用到的对象,将其放入灰色队列。

然后,从灰色队列中取出待扫描的对象,将其引用到的对象放入灰色队列,并将自身转置到黑色队列中。不断重复这一个步骤,直到灰色队列为空。

标记阶段结束的时候,所有白色对象即为垃圾,是本次GC过程中需要进行回收的。

不过,三色标记法存在缺点,需要在标记阶段停止所有的goroutine,这也就是我们常说的STW。如果用户程序和GC标记并发执行,用户程序可能在标记执行的过程中修改对象的指针,导致将本该死亡的对象标记为存活和本该存活的对象标记为死亡。

为了解决这个问题,go v1.8之后使用混合写屏障技术来支持并发执行。但是仍然会导致程序暂停,不过暂停的的时间缩短至0.5ms以内。

开启写屏障后,指针发生传递和新分配的内存都会进行标记,本轮GC不会回收,下次GC时在确定。虽然写屏障不能完全消除STW,但是可以大大缩短STW的时间。

4.GC触发时机

  1. 内存分配量达到阈值会触发GC

    阈值 = 上次GC内存分配量 * 内存增长额

    在go中的内存增加额由环境变量GOGC控制,默认为100,即内存增长一倍时触发GC

  2. 在堆上创建大于32KB对象的时候,会检测此时是否满足垃圾回收的条件,如果满足则直接进行垃圾回收

  3. 定时触发GC

      默认二分钟开启一次

  4. 主动触发

      程序代码中可以通过runtime.GC()方法主动触发GC

5.GC性能优化

  1. 减少对象分配的个数,采用复用对象或使用大对象组合多个小对象

  2. 在程序开发过程中,尽可能减少内存逃逸现象的发生

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

相关文章:

  • OpenStack概述
  • 机器学习练手(三):基于决策树的iris 多分类和波士顿房价预测
  • PS 2024 百种常用插件下载安装教程【免费使用,先到先得】
  • 逻辑推理之lora微调
  • 前端-防抖代码
  • langchain 入门指南 - 让 LLM 自动选择不同的 Prompt
  • web浏览器播放rtsp视频流,海康监控API
  • 操作系统原理:程序、进程、线程的概念
  • Golang是如何实现动态数组功能的?Slice切片原理解析
  • SQL注入 报错注入+附加拓展知识,一篇文章带你轻松入门
  • springboot项目里的包spring-boot-dependencies依赖介绍
  • C# 下的限定符运算详解(全部,任意,包含)与示例
  • 消息队列RabbitMQ部分知识
  • 看门狗应用编程-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板
  • Bug 解决 | 本地项目上线后出现错误
  • 为什么我工作 10 年后转行当程序员?逆袭翻盘!
  • 见证中国数据库的崛起:从追赶到引领的壮丽征程《四》
  • OpenCV||超细节的基本操作
  • 算法训练(leetcode)第三十八天 | 1143. 最长公共子序列、1035. 不相交的线、53. 最大子数组和、392. 判断子序列
  • STM32——外部中断(EXTI)
  • MySQL多实例部署
  • 云开发喝酒小程序3.6全新漂亮UI猜拳喝酒小程序 【已去除流量主】
  • 图论进阶之路-最短路(Floyd)
  • 安装sqllab靶机之后,练习关卡报403 forbidden
  • 微信VX多开 免扫码 登录 互斥体 可视化 Exui v1.1 易语言源码附成品软件
  • JavaEE 从入门到精通(一) ~ Maven
  • 滚珠丝杆与丝杆支撑座:稳定性与精度的双重保障
  • 实验5-11 空心的数字金字塔
  • C#对象和类型
  • 免费分享一套SpringBoot+Vue图书(图书借阅)管理系统【论文+源码+SQL脚本】,帅呆了~~