首页 > 其他分享 >为什么 Go 在 GC 时 STW 的时间很短

为什么 Go 在 GC 时 STW 的时间很短

时间:2024-11-01 13:12:46浏览次数:1  
标签:协程 标记 并发 STW GC Go

Go 语言在设计其垃圾回收(GC)机制时,强烈关注减少程序的停顿时间,特别是降低 Stop The World (STW) 的时长。通过采用三色标记法和写屏障技术,Go 的 GC 在扫描和清理阶段减少了 STW 的时间。同时,运用背景处理和协程并发管理,进一步确保了垃圾回收的高效与流畅,从而在保持内存管理效率的同时,尽可能降低对程序运行的影响。

1.Go语言的垃圾回收原理

Go 语言的 GC 运用的是三色标记清除算法,该算法分为标记和清除两个阶段。在标记阶段,Go 使用写屏障技术来跟踪并标记所有存活的对象;在清除阶段,则是回收被标记为垃圾的内存。这个过程中,STW 主要发生在标记的初始阶段和清除阶段的末尾,而 Go 通过优化这两个阶段来尽可能缩短 STW 的时间。

2.写屏障的运用

写屏障是用于减少垃圾回收中 STW 时间的关键技术。它允许应用程序的协程在 GC 标记阶段的大部分时间里并发执行。当协程在改变一个指针指向的同时,写屏障会更新 GC 的标记队列,这确保了即便在协程持续运行的过程中,GC 还是能正确地标记存活的对象。

3.协程并发管理

Go 语言是以其强大的协程并发管理而著称的。在 GC 运行时,协程的调度和管理依然能保持极低的延迟,即使在 GC 进行 STW 操作时,调度器也能迅速停止所有的协程,确保它们不会访问到正在被垃圾回收器处理的内存。

4.背景处理的优化

在清理阶段,Go 的 GC 同样采用背景清理,即使在 STW 阶段结束后,清理工作仍然在后台持续进行,这使得应用逻辑可以在 GC 清理阶段的大部分时间里和 GC 并发运行。后台清理利用了 CPU 的多核优势,分散了清理工作的负担,减少了清理对应用逻辑的干扰。

5.内存分配的策略

Go 语言通过分代假设,实现了一种高效的内存分配策略。新对象会被分配在堆的一个叫做新生代的区域,在这里对象可以更快被分配和回收。只有存活下来的对象才会被移动到老生代,这大大降低了老生代的垃圾回收频率,进一步减少了 GC 的运行时间。

总结

Go 语言的垃圾回收机制通过运用三色标记清除算法、写屏障、协程并发管理、背景处理和精心设计的内存分配策略,在保证内存安全管理的基础上,致力于降低垃圾回收对程序运行的影响。这使得 Go 在众多应用场景,尤其是需要高并发和低延迟的场景中,展现出了强大的实力和吸引力。在未来,Go 社区还将持续关注和优化 GC 机制,以应对更多样的应用需求和挑战。

常见问答

1.什么是 Go 语言中的 STW,它为何重要?

STW(Stop-The-World)是指垃圾回收(GC)期间,所有的用户线程(在Go中通常是协程)都被暂停的时间段。STW 时间的长短直接影响到了应用的响应时间和性能,因此,减少 STW 的时间可以明显提升应用的表现。

2. Go 的垃圾回收器是如何减少 STW 时间的?

Go 的 GC 在设计时采用了并发的方式来执行,它大部分工作在后台并发执行而非STW。它也采用了三色标记清除算法,在进行对象标记时,允许应用代码和标记操作并发执行。写屏障技术则保证了并发标记的准确性。协程的调度和内存分配策略也在减小 STW 时间上发挥了关键作用。

3.三色标记清除算法在减少 STW 时间上起了什么作用?

三色标记清除算法允许在进行对象标记的同时,应用代码仍然可以并发执行。标记操作并不要求完全停止用户代码,只在一些关键阶段(例如并发标记起始和终止阶段)短暂进行 STW。这大大减小了 STW 的时间窗口,增强了应用的实时响应能力。

4. 什么是写屏障技术,并如何通过写屏障来保证 GC 的准确性?

写屏障是在对象引用发生改变时所执行的一组操作。在 Go 的 GC 中,当进入并发标记阶段后,任何指针的写入操作都会触发写屏障。写屏障帮助 GC 在并发标记的过程中,保证对象图的准确性,避免因对象引用的改变而带来的标记遗漏。

5.如何理解 Go 语言中协程对减小 STW 时间的影响?

Go 语言中的协程(Goroutine)具有非常低的创建和销毁成本,且拥有高效的调度策略。在 GC 发生时,协程能够被迅速暂停和恢复,这意味着即使在必须执行 STW 操作的阶段,由于协程调度的高效性,STW 的时间也能被尽可能减小,减轻 GC 对应用性能的影响。

标签:协程,标记,并发,STW,GC,Go
From: https://www.cnblogs.com/98kya/p/18495536

相关文章

  • QGC汉化
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结前言QGC版本:4.1.1开发平台:Win11+QT5.15.2+VS2019原始代码:链接:https://pan.baidu.com/s/1H68Rz-4tO70-qI33HNU_bA?pwd=FYTf提......
  • Golang 开源库分享:anko - 给 Go 加点“脚本魔法”
    GitHub仓库链接:https://github.com/mattn/anko1.anko是干嘛用的?anko是一个可以让Go项目支持脚本语言的小工具。换句话说,就是我们可以给Go项目加点“脚本魔法”,在程序跑起来之后还能动态地改代码逻辑。比如,你在写一个应用,想让用户可以随时调整设置或控制程序的某些行为,而......
  • Go接口是什么
    Go接口是Go语言提供的一种抽象类型,它定义了一组方法,但是没有实现。而这些方法可以由任何满足接口定义的其他类型来实现。无论你是在编写库,还是构建大型的系统,理解和利用好Go接口都将极大地提升你的代码质量和编程效率。一、Go接口的定义和特征在Go语言中,接口是一种类型,它定义......
  • 【AIGC】深入探索『后退一步』提示技巧:激发ChatGPT的智慧潜力
    博客主页:[小ᶻZ࿆]本文专栏:AIGC|ChatGPT文章目录......
  • SpringCloud-课程安排
    基础篇d1--服务拆分+Eureka+Ribbon+Nacosd2--Nacos配置管理+Feign+Gateway网关d3--Docker+自定义镜像+dockerComposed4--MQ+RabbitMQ+SpringAMQPd5--ES+IK分词器+操作索引库+文档操作+RestClientd6--DSL查询+搜索结果处理+RestClient+查询文档+旅游实战案......
  • (开题报告)django+vue高校OA系统论文+源码
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于高校OA系统的研究,现有研究主要集中在传统开发技术或单一功能模块的优化上。在国内外,虽然OA系统已广泛应用于企业等领域,但专门针对......
  • (开题报告)django+vuejavaweb学生宿舍管理系统论文+源码
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于学生宿舍管理系统的研究,现有研究多集中于传统管理模式或单一功能模块的实现。在国内外,传统的学生宿舍管理方式主要依赖人工操作,效......
  • Goby 漏洞发布|Apache Solr /solr/admin/info/properties:/admin/info/key 权限绕过漏
    漏洞名称:ApacheSolr/solr/admin/info/properties:/admin/info/key权限绕过漏洞(CVE-2024-45216)EnglishName:ApacheSolr/solr/admin/info/properties:/admin/info/keyPermissionBypassVulnerability(CVE-2024-45216)CVSScore:7.3漏洞描述:ApacheSolr是一个开源搜索服......
  • ETLCloud遇上MongoDB:灵活数据流,轻松管理
    在当今数字化转型的大潮中,企业面临着数据管理的多重挑战。数据种类繁多、格式各异,传统关系型数据库往往难以满足这些复杂的需求。为了提升数据管理的灵活性与效率,越来越多的企业开始选择NoSQL数据库。而在众多NoSQL数据库中,MongoDB凭借其灵活的数据模型和强大的扩展性成为了佼佼者......
  • Flutter go_router库push导航后,浏览器地址栏的地址不更新的问题
    如果你使用.push()方法进行导航后,浏览器的地址栏的地址并没有更新,那是因为go_router经过了一次变更修改行为导致的。配置下边的GoRouter.optionURLReflectsImperativeAPIs=true;代码就行了。也可以去optionURLReflectsImperativeAPIs看属性说明。原文......