Golang运行时垃圾收集原理及调优

golang垃圾回收浅析 GC 常见垃圾回收算法 引用计数 标记清除 三色标记算法 复制算法 分代收集算法 golangGC的发展 golang GC 三色标记 主要流程 写屏障 三色标记状态的记录 扫描与对象元信息 GC 的触发 gcTriggerHeap gcTriggerTime gcTriggerCycle 辅助GC GC Pacer 根对象 标记队列 GC的流程 Phase1:标记前准备(STW) Phase2 并发标记 Phase3:标记终止(STW) Phase4:并发回收 阅读详情

Golang垃圾收集原理

        Go编译生成的目标程序会嵌入一个go运行时,里面包括一个垃圾收集器,类似java的虚拟机中的垃圾收集器,它负责收集并清理不再使用的内存空间。

不在垃圾收集范围内

        Go的标量基本数据类型不在垃圾收集的范围内,因为它们存在于goroutine stack 中,随着方法的结束而释放,这些变量类型有 uint、byte、指针等,垃圾收集主要管理堆区的内存。

垃圾收集采用的方式

        Go垃圾收集采用 标记-清理 方式来管理内存,当触发垃圾收集阈值时,首先标记不再适用的内存,然后清理掉用它们。

标记内存的方式

        采用对象图方式,标记初始阶段,go 会枚举根节点roots,能够作为根节点的有 本地变量、全局变量,从roots开始分析所有不可到达的内存引用。

GC的成本

        1.GC运行时程序代码会暂停

        2.GC会消耗CPU和内存

GO垃圾收集(简称GOGC)方式

        GOGC根据当前活动堆大小使用配置的GOGC值(允许的当前Live Heap峰值内存百分比)来决定是否启动垃圾收集,比如当前活动堆大小20MB,GOGC 设置为 100 ,当新分配内存堆峰值内存大于20MB时将触发垃圾收集。

如图

可以知道当GOGC设置的越小垃圾收集就会越频繁。

Go MemoryLimit(在Go 1.19版本可用)

        设置Go运行时可使用的堆内存,该限制并不是强制性,如设置Limit=20MB,程序实际需要100MB,实际也能够分配到100MB,但是垃圾收集器会频繁进行GC来试图保持不可能到达的Limit值。

GOGC配置推荐规则

 1.当部署程序到完全可控的环境下,建议根据实际需要设置MemoryLimit。

 2.GO程序与其它程序一起运行时不要关闭GOGC,关闭GOGC会导致耗尽内存影响到其它进程。

 3.部署到不可控的环境下时不要设置MemoryLimit(如 云环境 容器等)

GOGC实践(由于GO 1.19还未发布,无法测试MemoryLimit特性)

func main() {
	//设置GOGC峰值分配内存百分比
	debug.SetGCPercent(100)
	data := make([][]byte, 0)
	for index := 0; index < 10; index++ {
		//分配100MB
		var buff []byte = make([]byte, 1024*1024*100)
		for i := range buff {
			buff[i] = 111
		}
		//data = append(data, buff)
		time.Sleep(time.Duration(2 * time.Second))
		fmt.Println(len(buff))
		fmt.Println(len(data))
	}
}

 设置GOGC=100,在整个运行期间将保持合适的内存,程序总共分配了1G内存,活动堆内存为100MB,由于GOGC设置了100%,所以分配的峰值内存为100MB,所以程序始终保持200MB左右的内存。

 

保持分配内存存活(关联gc roots节点),GOGC=100,每次分配200MB,其中100MB关联到roots链,另外100MB不关联,当程序运行时始终保持合适的内存值。

 

关闭GOGC时,内存占用会保持实际分配的内存量

Golang-Scheduler原理解析 本文主要分析Golang里面对于协程的调度原理,本文与Golang的memory allocation、channel、garbage collection这三个主题是紧密相关的,本文scheduler作为系列的第一篇文章。 文章大体上的思路是这样的: section1:主要图示和文字介绍scheduler的原理; section2:从源码和模型的角度介绍scheduler原理; section... 阅读详情

相关推荐

Golang-垃圾回收原理解析

go 垃圾回收 本文基于整个go的gc发展,来研究其gc的演变过程,不单打针对某个版本的gc,因为go的gc一直在演变 一.GO GC的发展历史 go v1.1 : 标记清除法,整个过程都需要STW go v1.3 : 标记清除法,标记过程仍然需要STW,但是清除过程并行化,gc pause约为几百ms go v1.5 : 引入插入写屏障技术的三色标记法,仅在堆空间启动插入写屏障,全部扫描...

Y先森0.0 807

Go内存优化与垃圾收集

你好,我是俞凡,在Motorola做过研发,现在在Mavenir做技术工作,对通信、网络、后端架构、云原生、DevOps、CICD、区块链、AI等技术始终保持着浓厚的兴趣,平时喜欢阅读、思考,相信持续学习、终身成长,欢迎一起交流学习。可以看到,当前堆的大小一直在增长,直到达到活跃堆大小的1000%。

残星说梦话 2328

Go GC调优进阶:GOGC与GOMEMLIMIT

GOGC按百分比控制堆增长触发时机,默认100即堆翻倍触发,调高省CPU费内存。GOMEMLIMIT是Go 1.19的软内存上限,堆接近限制时pacer主动提前触发GC压堆,存活数据超限则无能为力。容器化服务推荐GOGC=off加GOMEMLIMIT的组合,让GC只在内存压力大时跑,最大化降低频率。单独关GOGC不设上限是灾难,堆无界增长必然OOM,必须配内存兜底。GOMEMLIMIT设太低则导致GC thrashing,根本解法是减少存活数据。

白话机器学习 198

提升您的 Go 应用性能的 6 种方法

在 Go 应用程序中积极使用的6种优化方法。

csjds的专栏 1018

基于Isaac Gym与PPO算法的机械臂抓取任务仿真与强化学习实战(附完整代码与训练策略)

本文详细介绍了基于Isaac Gym与PPO算法的机械臂抓取任务仿真与强化学习实战。通过环境搭建、PPO算法实现、奖励函数设计等核心环节的优化,结合完整代码与训练策略,显著提升机械臂抓取效率与成功率。特别适合开发者快速掌握强化学习在机器人控制领域的应用。

weixin_29256771的博客 599

Spark Graphx 项目实战(航班飞行网图分析)

航班飞行网图分析一.需要的技能点二.任务描述三.数据探索1.下载数据2.数据格式四.航班飞行网图问题分析1.构建航班飞行网图2.统计航班飞行网图中机场与航线的数量3.计算最长的飞行航线4.找出最繁忙的机场5.找出最重要的飞行航线6.找出最便宜的飞行航线五.代码实现 一.需要的技能点 Spark GraphX API Spark GraphX PageRank Spark GraphX Pregel 二.任务描述 需求概述: 探索航班飞行网图数据 构建航班飞行网图 使用Spark GraphX完成下列任

May_J_Oldhu的博客 1538

Go垃圾回收参数调优:实现低延迟服务的实战指南

现代Go(1.5版本后)采用三色标记-清除算法进行垃圾回收。白色:潜在的垃圾,可能会被回收灰色:已被发现但还未处理完的对象黑色:确定仍在使用的对象,不会被回收初始时,所有对象都是白色(假设所有人都要离开城市)从根对象(全局变量、栈变量等)开始,标记为灰色(确认这些人要留在城市)检查灰色对象引用的其他对象,将它们也标记为灰色,同时将已检查完的灰色对象标记为黑色(被留下的人的亲朋好友也要留下)重复步骤3,直到没有灰色对象(所有要留下的人都确认完毕)

sinat_27016095的博客 1279

Quantum Espresso Hands-On实战训练(四)——PDOS计算与轨道分析

本文详细介绍了Quantum Espresso中PDOS计算与轨道分析的实战方法,重点解析了PDOS在材料电子结构研究中的核心价值,包括原子级分辨率、轨道级解析和自旋极化分析。通过具体案例和操作步骤,帮助读者掌握从输入文件准备到结果解读的全流程,并提供了高级分析技巧和疑难问题解决方案。

weixin_29211309的博客 504

Golang的trace性能分析

本文主要介绍trace的使用以及需要关注的点。

铁柱的博客 4632

手把手教你用PLECS仿真BUCK数字电源(含DSP代码实现)

本文详细介绍了如何利用PLECS仿真软件与Visual Studio 2022搭建高保真数字电源开发环境,手把手指导从BUCK电路建模、编写硬件感知的C控制算法到参数调优的全过程。重点阐述了通过DLL接口实现软件在环仿真,模拟DSP的ADC/PWM时序,并将验证后的代码无缝迁移至TI C2000系列DSP,构建从仿真到固件的完整数字电源开发闭环,显著提升开发效率与一次成功率。

oo7890的博客 395

io_uring vs epoll ,谁在网络编程领域更胜一筹?

简介:从定量分析的角度,通过量化 io_uring 和 epoll 两种编程框架下的相关操作的耗时,来分析二者的性能差异。 本文作者:王小光,「高性能存储技术SIG」核心成员。 背景 io_uring 在传统存储 io 场景已经证明其价值,但 io_uring 不仅支持传统存储 io,也支持网络 io。io_uring 社区有众多的开发者尝试将 io_uring 用于网络应用。我们之前也在《你认为 io_uring 只适用于存储 IO?大错特错!》中也探索过 io_uring 在网络场景的应用及其

阿里云云栖号 3035

Go 1.25 新特性实战:greenteagc 垃圾收集器性能调优

大幅提升了 GC 性能,尤其适合高并发小对象分配场景

码刀攻城 1215

SigFit实战:从FEA到光学仿真的热力耦合分析全流程解析

在光机系统与芯片封装等精密工程领域,热与力的耦合效应是影响产品性能与可靠性的核心物理问题。有限元分析(FEA)是预测结构在热、力载荷下变形与应力的基础工具,但其结果通常无法直接用于评估光学性能。这需要一座桥梁,将物理场数据转化为光学设计语言。其核心原理在于数据映射与面形表征技术,例如通过泽尼克多项式拟合,将离散的节点位移分解为离焦、像散等标准光学像差。这项技术的工程价值在于,它实现了多物理场仿真的闭环,使工程师能在设计阶段精准预测热变形或应力对波前误差、调制传递函数等关键光学指标的影响。其典型应用场景包括高

weixin_28630185的博客 338

针对 Kubernetes 工作负载优化–Go 的垃圾收集器|一种动态调优方法

正如 Golang 文档中所述,每个周期的 GC 成本是恒定的,因此,如果我们想将 GC 的 CPU 时间减半,就需要将执行的周期数减半,或者换句话说,我们需要将两个周期之间的间隔加倍。这代表着一个重大的机遇:如果我们能够通过充分利用未充分利用的内存预算来降低 GC 的 CPU 开销,那么我们就能在整个平台上实现显著的效率提升。最常见的误解之一是 GC 暂停时间与释放的内存量相关。要消耗 10% 的内存,我们需要大约 2 GiB 的内存,我们实际上以每 GiB 内存 5% 的 CPU 时间进行交易。

u012516914的专栏 667

OpenCv案例(七): 基于OpenCvSharp计算图像的清晰度(自动对焦)

自动对焦,其实是对相机成像的清晰值得计算,若对焦不清晰,成像的清晰度低,视觉效果模糊。若是在工业检测行业,对焦不准确,可能会造成严重后果;对焦准确的图像,其清晰度高,对比度鲜明,层次明显。

qq_37835727的博客 7113

超声相控阵合成孔径成像FPGA设计介绍

1.仿真预览 2.理论分析 系统的基本结构如下所示: 以上是实际中完整的结构,系统中会涉及到两块板子中的时钟,这个就是设计一个时钟采样同步的问题,即所谓的时钟同步。一般这种情况,往往使用内插的方式来解决。这是由于,在实际中,超生波接收到的信号是由本身系统发送出去反射回来得到的,因此从另外一方面将,其是同步的。但是在接收的时候通过内插的方法解决其中的延迟问题。 根据论文中的介绍,整个系统分为如下几个部分: ·模拟发送信号,这个部分由MATLAB产生测试数据并量...

FPGA/MATLAB学习教程/源码/项目合作开发 2069

【Golang】有关垃圾收集器的笔记

本文主要介绍了Golang中垃圾回收的部分机制

#include>的博客 1153

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

golang垃圾回收原理_golang的垃圾回收(gc)机制运行原理

垃圾回收开始时从root对象开始扫描,把root对象引用的内存标记为”被引用”,考虑到内存块中存放的可能是指针,所以还需要递归的进行标记,全部标记完成后,只保留被标记的内存,未被标记的全部标识为未分配即完成了回收。前面介绍了对象标记状态的存储方式,还需要有一个标记队列来存放待标记的对象,可以简单想象成把对象从标记队列中取出,将对象的引用状态标记在span的gcmarkBits,把对象引用到的其他对象再放入队列中。上图中,内存块1、2、4号位上的内存块已被分配(数字1代表已被分配,0 未分配)。

2401_87361386的博客 1045

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

二. go 内存管理之 垃圾收集

了解垃圾收集前,先了解一下STW垃圾收集器在回收垃圾时,必须在一个能保障一致性的快照中进行的,如果不满足,分析垃圾的结果的准确性就无法保证,所以通过挂起所有用户线程来保证,这个挂起是JVM在后台自动发起的,也就是我们说的Stop the World进而引出什么时候挂起用户线程: 是在一个特定的位置挂起用户线程,这个特定的位置被称为安全点SefePoint,

qq_29799655的博客 1298

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

深入理解 Go 语言垃圾回收器:原理、优化与实践

本文深入剖析 Go 语言垃圾回收器(GC),从 Go 值的存储位置出发,阐述追踪垃圾回收机制、GC 周期及成本构成。详细解读 GOGC 参数和内存限制对 GC 行为的影响,探讨延迟问题、终结器等相关特性。同时提供优化指南,涵盖识别成本、减少堆分配等方法,结合示例代码与实际场景,助力开发者全面掌握 Go 语言 GC 原理并优化程序性能。尤其新增 GC 调优具体步骤,为开发者提供更具操作性的指导。

Tekin 是深耕技术 20 年的全栈实战派专家,精通 Go/Python/Java 等多语言开发。博客专注技术原理与实战结合,深度解析 Python 高阶编程、Go 语言架构、数据库优化等硬核内容。涵盖并发编程、机器学习、云原生等前沿领域,通过真实案例拆 1386

golang垃圾回收原理_golang的垃圾回收(gc)机制运行原理(1)

所谓垃圾就是不再需要的内存块,这些垃圾如果不清理就没办法再次被分配使用,在不支持垃圾回收的编程语言里,这些垃圾内存就是泄露的内存。Golang的垃圾回收(GC)也是内存管理的一部分。

2401_87361347的博客 834

Go容器化环境中的内存限制与调优:实战指南

经过上述章节的讨论,我们已经深入了解了Go容器化环境中的内存限制与调优技术。最后,让我们展望未来并总结关键经验。明确告知Go运行时内存限制使用GOMEMLIMIT设置软内存限制将限制设置为容器限制的70%-80%代码层面的优化预分配内存,减少动态扩容使用对象池减少GC压力注意长连接和goroutine泄漏监控与分析建立完善的监控系统,包括内存使用、GC频率和延迟定期进行pprof分析,发现潜在问题容器配置最佳实践设置合理的内存请求和限制比例禁用或限制swap使用。

sinat_27016095的博客 1066

Go GOGC环境变量调优与实战案例

Go语言使用标记-清除(Mark-and-Sweep)算法进行垃圾回收。这一过程分为两个阶段:标记阶段,GC遍历对象图,标记仍被引用的“活”对象;清除阶段,回收未标记的“死”对象内存。Go的GC是并发GC,允许在程序运行时并行执行标记和清除,减少暂停时间。Go的堆内存分配由运行时管理。当程序分配的对象达到一定阈值,GC会被触发。触发条件与堆中存活对象的内存量相关,而GOGC环境变量正是控制这一阈值的关键。GOGC是Go性能调优的“秘密武器”,通过调整GC触发频率,能够显著提升吞吐量或降低延迟。

sc35262的博客 1015

go的垃圾回收设计原理

收集器的行为:收集器有三个工作阶段,必须执行的第一个活动是打开写入屏障。写入屏障的目的是允许收集器在收集期间保持堆上的数据完整性,因为收集器和应用程序 goroutine 将同时运行。为了打开写入屏障,必须停止运行的每个应用程序 goroutine。这种活动通常非常快,平均在 10 到 30 微秒内。也就是说,可以保证应用程序 goroutine 正常运行。

qq_59395271的博客 960

【Golang详解】go语言垃圾回收GC(一) 设计原理

GC垃圾回收机制设计原理 标记清除 1.3版本之前。大概分为两阶段: 标记阶段 - 从根对象出发标记堆中存活的对象 清除阶段 - 遍历堆中所有对象,回收未被标记的垃圾对象 1.0版本:是完全串行的,这两个阶段都在STW暂停范围之内 1.1版本:在多核主机并行执行垃圾收集的标记和清除阶段 缺点:整个过程都需要 STW 三色标记 概述: 三色只是为了叙述上方便抽象出来的一种说法,实际上对象并没有颜色之分。这里的三色,对应了垃圾回收过程中对象的三种状态: 白色是要回收的,黑色是被引用的,灰色是对象还在标记队列中

weixin_45901764的博客 2270
上一篇: Kubernetes 自定义控制器开发
下一篇: openpilot 项目解析及 xgnpilot
IT回忆录
博客等级 码龄16年 42粉丝 100原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值