Go语言垃圾回收机制原理

1. 概述

        垃圾回收是一种自动内存管理技术:通过检测程序中不再使用的内存,并释放这些内存供其他对象使用。

        应用程序中会使用到两种内存,分别为堆(Heap)和栈(Stack)。GC不负责回收栈内存,只负责回收堆内存。 函数执行完后,栈内存直接释放,不需要GC回收;堆是程序共享的内存,需要GC进行回收。

        在Go语言中,垃圾回收器通过标记-清除(Mark-Sweep)算法来实现对内存的管理。

2. 实现细节

(1) 标记阶段: 垃圾回收器从根对象(具体见下面)开始,遍历所有可达对象,将其标记为活动的或被引用的。根对象包括全局变量、静态变量等。(具体见下面的三色标记法) 。

(2) 清除阶段:垃圾回收器遍历所有对象,将未被标记的对象(不可达对象)进行回收,其占用的内存空间标记为空闲状态。

(3) 压缩阶段:垃圾回收器对内存进行压缩,将所有空闲的内存空间合并成一个连续的内存块,以便更高效地分配内存。

3. 根对象包括:

(1) 全局变量:存在于程序整个生命周期的变量。

(2) 执行栈:每个 goroutine 都包含自己的执行栈,执行栈上包含栈上的变量及指向堆内存区块的指针。

(3) 寄存器:寄存器的值可能表示一个指针,指向堆内存区块。

4. 三色标记法(go1.5垃圾回收原理)

    相比于1.3的标记法,1.5的三色标记法优势是无序STW(暂停程序),按以下步骤操作:

(1) 只要是该程序创建的对象,都标记为白色。

(2) 每次GC开始,从根对象开始遍历所有对象,把遍历到的对象从白色放到灰色集合。

(3) 遍历灰色集合,将灰色对象引用到的对象,从白色集合放到灰色集合;然后将此灰色对象放到黑色集合。

(4) 重复第(3)步直到灰色集合为空。

(5) 回收所有白色标记的对象(垃圾回收)

5. 屏障机制

    在标记阶段过程中,应用程序可能会改变对象引用树,导致 三色不变式 规则被破坏。所以需要添加屏障机制,保证三色不变式有效,主要两个机制如下:

(1) 插入写屏障:在A对象引用B对象时,B对象被标记为灰色。

(2) 删除写屏障:被删除的对象如果为灰色或者白色,那么被标记为灰色

7. 垃圾回收的性能优化体现点

(1) 并行化:标记和清除阶段可以并行执行,以提高垃圾回收的性能。

(2) 延迟清除:为了减少垃圾回收过程中的停顿时间,垃圾回收器采用延迟清除策略。即只有在内存压力较大时才进行清除操作,以避免频繁的垃圾回收。

(3) 懒惰标记:指只有在需要分配新对象时才进行标记操作。这样可以减少不必要的标记工作,提高垃圾回收的性能。

(4) 内存压缩:通过内存压缩技术,可以减少内存碎片,提高内存分配和释放的效率。

8. 总结

        Go语言的垃圾回收机制是一种高效且可靠的内存管理方案。

        通过采用标记-清除算法以及一系列性能优化策略,垃圾回收器能够自动管理内存,避免内存泄漏和内存溢出等问题。

        同时,Go语言的垃圾回收器还针对并发编程进行了优化,以减少对并发执行的影响。

参考文章:go垃圾回收机制(三色标记法)& 屏障机制_go三色标记法与读写屏障-CSDN博客

GO进阶(5) 垃圾回收机制-腾讯云开发者社区-腾讯云 

百度安全验证 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/15313.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《计算机网络微课堂》课程概述

​ 课程介绍 本专栏主要是 B 站课程《计算机网络微课堂》的文字版,作者是湖南科技大学的老师。 B 站地址:https://www.bilibili.com/video/BV1c4411d7jb 该课程好评如潮,包含理论课,实验课,考研真题分析课&#xf…

Jenkins在windows上进行安装

今天为了实现jmeter接口测试脚本的持续性集成安装了jenkins,主要记录jenkins的安装和端口的修改。 前提条件:安装了jdk,我本机安装的jdk1.8。 1.下载jenkins安装包 安装jenkins我们需要先下载安装包,可以通过下面的链接进行下载&a…

10分钟用QEMU搭建嵌入式开发环境学习Linux

安装依赖软件 作者的使用的是ubuntu22.04版本。 sudo apt-get install git libglib2.0-dev libfdt-dev libpixman-1-dev zlib1g-dev ninja-build sudo apt-get install git-email sudo apt-get install libaio-dev libbluetooth-dev libcapstone-dev libbrlapi-dev libbz2-d…

JavaSE--基础语法(第一期)

Java是一种优秀的程序设计语言,它具有令人赏心悦目的语法和易于理解的语义。不仅如此,Java还是一个有一系列计算机软件和规范形成的技术体系,这个技术体系提供了完整的用于软件开发和 跨平台部署的支持环境,并广泛应用于嵌入式系统…

基于Docker的ElasticSearch、Kibana服务搭建并开启用户鉴权

🏷️个人主页:牵着猫散步的鼠鼠 🏷️系列专栏:云原生与服务部署专栏 🏷️个人学习笔记,若有缺误,欢迎评论区指正 目录 1. 前言 2. 服务搭建 2.1. 部署ElasticSearch 2.2. 部署Kibana 3. …

安全态势管理的六大挑战:态势感知

德迅云安全鉴于如今的安全威胁不断变幻,企业对实施态势管理策略至关重要,可以让安全团队根据需要进行安全策略的动态调整。如果企业在研究构建态势感知管理,需要特别关注以下六个方面的挑战。 如果企业正在使用一个或多个平台,那么…

java为什么main方法是主程序入口?已回答

答: 其实是C语言程序员规定的main,java程序才能通过main来进入程序,java程序是通过jvm虚拟机来运行的,其实main方法是可以修改的,C程序员来规定是main方法来进入主程序,还是其他方法进入主程序,…

IS-IS链路状态数据库

原理概述 一个OSPF链路状态数据库是若干条LSA的集合。与此相似,一个IS-IS链路状态数据库是由若干条LSP的集合。与OSPF链路状态数据库不同,IS-IS链路状态数据库有Level-1和Level-2之分。 在IS-IS协议中,每一条LSA都有一条剩余生存时间、一个…

[力扣题解] 417. 太平洋大西洋水流问题

题目&#xff1a;417. 太平洋大西洋水流问题 思路 代码 (1) MyMothed // 符合条件的点 : 既可以到达左或上边界&#xff0c;也可以到达右或下边界&#xff1b; class Solution { private:int dir[4][2] {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};vector<vector<int>&g…

safetensors介绍

1 介绍 safetensors 是 Huggingface 推出的一种可靠、易移植的机器学习模型存储格式&#xff0c;用于安全地存储 Tensor&#xff0c;而且速度很快&#xff08;零拷贝&#xff09;。 safetensors 格式结构&#xff1a; 8 bytes&#xff1a;一个无符号的整数&#xff0c;表示…

Dubbo源码及总结

Springboot整合Dubbo启动解析Bean定义 根据springboot启动原理&#xff0c;会先把启动类下的所有类先进行解析bean定义&#xff0c;所以要先EnableDubbo这个注解&#xff0c;再根据这个注解里面的注解&#xff0c;可以知道import的两个类DubboComponentScanRegistrar和DubboCo…

输入一串字符,输入想要字符串前*的个数n,判断字符串前*的个数是大于n还是小于n,如果大于n则删除多余的*其它保持不变,如果小于n,则字符串也保持不变

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> void fun(char* a, int n) {int i 0, j 0, m 0,b0,c0;char* p;p a;//第一步&#xff0c;判断字母前面有多少个*while (p[i] *){j;}printf("字母前*的个数%d\n",j);//求总的字符串长度while (a[m] !…

【全开源】沃德商协会管理系统源码(FastAdmin+ThinkPHP+Uniapp)

一款基于FastAdminThinkPHPUniapp开发的商协会系统&#xff0c;新一代数字化商协会运营管理系统&#xff0c;以“智慧化会员体系、智敏化内容运营、智能化活动构建”三大板块为基点&#xff0c;实施功能全场景覆盖&#xff0c;一站式解决商协会需求壁垒&#xff0c;有效快速建立…

护眼小贴士:学生如何正确使用台灯?

随着电子设备的普及和长时间的用眼&#xff0c;长时间盯着屏幕或学习&#xff0c;眼睛需要不断调节焦距&#xff0c;导致眼睛肌肉疲劳&#xff0c;进而引发视力下降。这种现象在年轻一代甚至青少年中尤为普遍&#xff0c;这种疲劳状态不仅影响眼睛的舒适度&#xff0c;还会导致…

linux配置防火墙端口

配置防火墙&#xff0c;添加或删除端口&#xff0c;需要有root权限。 防火墙常用命令如下&#xff1a; 1.查看防火墙状态&#xff1a; systemctl status firewalld active(running)&#xff1a;开启状态&#xff0c;正在运行中 inactive(dead)&#xff1a;关闭状态&#xff…

十、OpenAI之视觉

视觉 学习怎样使用视觉能力理解图片 1. 介绍 GPT-4o和GPT-4 Turbo两个模型都拥有视觉能力&#xff0c;这意味着模型可以接收图片并回答关于图片的问题。从历史上看&#xff0c;语言模型系统被限制采用单一的文本输入方式。 2. 快速开始 模型使用图片主要有2种方式&#xff…

qml下拉条实现

qml下拉条实现 代码结构 代码结构 Rectangle里面嵌套一个Flickable&#xff0c;然后下面是一个Rectangle&#xff0c;作为滑动的区域&#xff0c;给最外层的Rectangle的y加一个属性动画。滑动区域写好onPressed和Onrelease即可。 import QtQuick 2.15 import QtQuick.Control…

从《红楼梦》的视角看大模型知识库 RAG 服务的 Rerank 调优

背景介绍 在之前的文章 有道 QAnything 源码解读 中介绍了有道 RAG 的一个主要亮点在于对 Rerank 机制的重视。 从目前来看&#xff0c;Rerank 确实逐渐成为 RAG 的一个重要模块&#xff0c;在这篇文章中就希望能讲清楚为什么 RAG 服务需要 Rerank 机制&#xff0c;以及如何选…

Redisson-分布式锁单Redis节点模式

Redisson-分布式锁单Redis节点模式 为什么要用分布式锁&#xff1f; 使用分布式锁的主要目的是为了解决多线程或多进程并发访问共享资源时可能出现的竞争条件和数据一致性问题。举一些实际场㬌&#xff1a; 数据库并发控制&#xff1a;在分布式系统中&#xff0c;多个节点同…

虚拟机上部署java微服务

在Windows服务器上安装Ubuntu系统&#xff0c;先安装虚拟机&#xff0c;然后再虚拟机上安装Ubuntu系统 启动虚拟机上的Ubuntu系统&#xff0c;然后安装jdk。安装好的Ubuntu系统是带桌面版的&#xff0c;需要打开 “终端” 控制台&#xff0c;通过命令行交互的方式部署程序&…