问题

如何看待GO语言的新GC(TOC)?

回答
如何看待 Go 语言的新 GC (TOC)?

Go 语言在垃圾回收 (GC) 方面一直备受关注,其 GC 的效率和对程序性能的影响是开发者们重点考量的一点。近年来,Go GC 经历了多次重要的迭代和改进,其中最引人注目的便是引入的 TOC (TimeOfCollection) 垃圾回收器。

为了更深入地理解 TOC GC,我们需要将其与之前的 GC 实现进行对比,并分析其带来的改进、潜在的权衡以及未来的发展方向。

一、 Go GC 的演进历程与 TOC GC 的定位

在 TOC GC 之前,Go GC 主要经历了以下几个阶段:

早期 GC (MarkandSweep): 最早的 GC 实现,简单但存在“三色标记法”中的“浮动垃圾”问题,即在标记阶段未被回收的垃圾在标记结束后仍然存在,直到下次 GC 周期。
并发标记扫除 GC (Concurrent Mark and Sweep): 引入了并发标记,将标记工作与应用程序并发进行,显著降低了 STW (StopTheWorld) 暂停时间。但依然存在写屏障 (Write Barrier) 带来的性能开销。
三色标记法 (Tricolor Marking) 和写屏障 (Write Barrier): 这是理解 Go GC 核心的关键概念。三色标记法是一种垃圾回收算法,将对象标记为白色(潜在垃圾)、灰色(已访问但未完全扫描)、黑色(已访问且扫描完毕)。写屏障是为了解决并发标记过程中,并发写操作可能导致已扫描过的对象被误判为垃圾的问题。它需要在写操作发生时,确保对象图的一致性。
“并行” GC: 早期也曾使用“并行” GC 的说法,但更准确的理解是“并发” GC。

TOC GC 的出现,标志着 Go GC 在“并发”的基础上,进一步朝着更低暂停时间、更优吞吐量和更可控性迈进。 TOC GC 的核心目标是 进一步减少 GC 对应用程序的暂停时间,并提高整体的吞吐量。它通过引入更精细化的控制和更优化的算法来实现这一目标。

二、 TOC GC 的核心技术与改进点

TOC GC 的全称是 "TimeOfCollection",虽然官方文档中直接使用 "TOC GC" 的说法并不多,但它代表了 Go GC 近年来在降低延迟和提升效率方面的方向。理解 TOC GC,实际上是理解 Go 1.5 及之后版本 GC 的一系列改进,尤其是针对 并发三色标记法 的优化。

TOC GC 的主要改进点体现在以下几个方面:

1. 更低的 STW 暂停时间:
并发三色标记法 (Concurrent Tricolor Marking): 这是 TOC GC 的基石。通过并发标记,垃圾回收器和应用程序几乎可以同时运行,大大减少了需要暂停应用程序的时间。标记阶段的大部分工作都是在并发进行的。
写屏障的优化: 为了维持并发标记的正确性,需要使用写屏障。TOC GC 在写屏障的实现上进行了优化,例如使用 混合写屏障 (Hybrid Write Barrier)。传统的写屏障可能会在每次写操作时都触发 GC 逻辑,而混合写屏障则能在某些情况下避免不必要的开销,例如在某些“关键时刻”进行写屏障的同步。这有助于降低并发写操作对 GC 性能的影响。
标记完成的精确控制: TOC GC 更加注重在何时完成标记。它会寻找一个合适的时机来执行标记的最后一步(例如,在一次 STW 中完成剩余的灰色节点扫描),并将 STW 的时间控制在非常短的范围内,确保大部分标记工作在并发中完成。

2. 更高的吞吐量:
更少的 GC 线程干扰: 通过更高效的并发和更精确的控制,GC 线程对应用程序线程的干扰被最小化,从而提高了应用程序的整体吞吐量。
减少重复工作: GC 算法的设计也力求避免重复扫描或处理已经标记过的对象,提高回收效率。

3. 更优的内存管理:
精确扫描堆对象: TOC GC 在扫描堆对象时,力求做到更精确,避免扫描不必要的内存区域,从而提高效率。
与 M, P, G 模型的协同: Go 语言的调度模型 (M: 物理线程, P: 逻辑处理器, G: goroutine) 与 GC 紧密结合。TOC GC 的设计会考虑如何与这些模型协同工作,例如如何合理分配 GC 工作到不同的 M 上,以及如何利用 P 的资源进行并发 GC。

4. 可配置性 (虽然早期不明显,但是发展方向):
虽然早期版本的 Go GC 并没有提供太多用户可配置的选项,但随着 GC 的发展,更多地引入了可以调整的参数,允许开发者根据应用程序的特性进行微调,例如 `GOGC` 环境变量就影响了 GC 的触发时机。

三、 TOC GC 带来的影响与权衡

正面影响:

极低的暂停时间 (毫秒级别甚至亚毫秒级别): 这是 TOC GC 最显著的优点。对于需要低延迟的应用程序(如微服务、实时数据处理),这意味着 GC 不再是性能瓶颈。
提升应用程序整体性能: 更少的暂停时间和更小的 GC 开销,直接转化为更高的吞吐量和更稳定的性能表现。
开发者体验提升: 开发者不再需要过多地担心 GC 对程序的影响,可以更专注于业务逻辑的实现。

潜在的权衡 (以及 Go 团队如何解决):

CPU 开销: 为了实现并发和低暂停,GC 需要消耗更多的 CPU 资源来执行标记、扫描等工作。Go 团队通过优化算法和利用并发能力来最小化这种开销。
内存开销: GC 算法本身可能需要额外的内存来存储 GC 元数据(例如三色标记的状态)。同时,为了减少暂停,GC 可能会在堆内存使用率不高时就开始进行部分回收,这可能导致 GC 提前运行,产生一定的“预 GC”开销。
复杂度: 更先进的 GC 算法自然也更复杂,给 Go 语言的维护者带来了更高的开发和维护成本。

四、 总结与展望

TOC GC 是 Go 语言在垃圾回收领域的一项重要进步,它通过 并发三色标记法 和一系列的优化,极大地降低了 GC 的暂停时间,并提升了整体的吞吐量。这使得 Go 语言在构建高性能、低延迟的现代应用程序方面更具竞争力。

如何看待 TOC GC?

积极看待: TOC GC 是 Go GC 发展的重要里程碑,它解决了许多开发者在早期版本中对 GC 性能的担忧。
理解其工作原理: 了解并发三色标记法、写屏障等概念,有助于更好地理解 GC 的行为和性能影响。
关注 GC 的调优: 虽然 TOC GC 已经非常优秀,但对于一些极端场景或有特殊性能需求的应用程序,仍然需要关注 GC 的调优参数(如 `GOGC`),并结合性能分析工具来优化 GC 的行为。
持续关注 Go GC 的发展: Go 语言的 GC 仍在不断进化,未来可能会有更精细化的控制和更优化的算法出现。

展望:

更精细化的控制: 未来可能会有更多可配置的选项,允许开发者更深入地控制 GC 的行为,以适应不同的应用场景。
AI/ML 辅助 GC: 随着人工智能技术的发展,未来 GC 可能会利用机器学习来预测内存分配模式,从而更智能地调度 GC 过程,进一步提升效率。
更优化的写屏障: 写屏障的性能开销是并发 GC 的一个重要考量,未来可能会有更轻量级或更智能的写屏障实现。

总而言之,TOC GC 代表了 Go 语言在提升运行时性能方面所做的巨大努力,它使得 Go 语言成为构建高性能、可伸缩的现代应用程序的优秀选择。理解其技术原理和带来的影响,有助于我们更好地使用和优化 Go 程序。

网友意见

user avatar

谨慎乐观。首先这不是一个全新GC, 而是原有GC上加的一个新优化路径。TOC要解决的问题或者背景假设是很经典的,用正常人的话来说就是:「程序执行中产生的大部分对象的生命周期都很短,而且都只在局部使用。」基于局部使用假设,首先可以做的是静态的逃逸分析,在编译期就指出很大一部分对象的生命周期,这个 Go 也已经做了,而且还在优化。至于不能在编译期确定生命周期的,在运行时的垃圾回收中很常见的做法就是分代 GC, 让年轻对象更快更容易回收,降低全局 GC 压力。

而 TOC 基于的假设是上面短生命周期假设的一个特化版本:

  1. 绝大部分事务(比如一个 HTTP 请求处理)都是短事务。
  2. 每个事务开一个新的 goroutine 来处理,处理完 goroutine 结束。
  3. 执行期间产生的大部分对象都只在goroutine内部使用。

那么,如果可以准确标记哪些对象是跨 goroutine 共享了,那在goroutine结束的时候把没有共享出去的全回收掉就可以了。实现一个准确及时回收内存还能用好多核还性能好的分代GC非常复杂,还要针对各种场景优化,我记得 golang-dev 邮件组讨论过要不要实现分代 GC, 不过看来结论是 TOC 了,TOC其实就是一个基于特化假设的特化简单实现,这很 gopher.

一个对象有没有跨goroutine共享出去(文档里的publish)是有传递关系的,你被一个published的对象引用了那你和所有你引用的对象也published了,如果我没看错,现在的设计是要在write barrier上递归标记这个状态的。我会担心这样下来是否会有一些场景的运行时开销比原来更大了。TOC 对它要优化的场景应该是能同时实现提高吞吐(降低运行时开销),降低停顿时间和节省内存占用的目标的,还能在多核环境高效扩展,而这个场景也确实是网络服务中的统治性场景。但还是要看有没有被严重劣化的场景,以及最后真实服务的综合效能。

这种运行时优化的东西,现在已经很难有一个超级聪明的想法然后秒杀所有前人成果了,都是针对实用场景优化,很多时候只要运行时数据摆在你面前,解决方法是显而易见的。我一直对 Go 的运行时优化持乐观态度,并不是因为有大牛操刀,而是因为他们可以从Google内部机群拿到巨量的运行时数据来支持设计决策和测试新想法。保持简单,看实际环境数据做优化,这个大方向是靠谱的。

类似的话题

  • 回答
    如何看待 Go 语言的新 GC (TOC)?Go 语言在垃圾回收 (GC) 方面一直备受关注,其 GC 的效率和对程序性能的影响是开发者们重点考量的一点。近年来,Go GC 经历了多次重要的迭代和改进,其中最引人注目的便是引入的 TOC (TimeOfCollection) 垃圾回收器。为了更深入地.............
  • 回答
    Go 语言的泛型,又名“类型参数”,在经过社区多年的讨论和权衡后,终于在 1.18 版本正式落地。这绝对是 Go 语言发展史上的一个重要里程碑,它就像是给这个原本就以简洁高效著称的语言注入了新的活力,让它能够处理更广泛的编程场景。在此之前,Go 社区一直在“是否引入泛型”这个问题上摇摆不定。一方面,.............
  • 回答
    哔哩哔哩(B站)将其海量Java后台工程迁移至Go语言,这绝对是互联网技术领域一件相当有分量的大事件,值得我们细细道来。这可不是一个小小的版本更新,而是对整个底层技术栈的深度重塑,其背后的考量和影响,绝对是值得深入探讨的。首先,咱们得明白,B站的体量可不是闹着玩的。一个能支撑数亿用户活跃的视频平台,.............
  • 回答
    Go 语言进入 TIOBE Top 20:一次深入的解读Go 语言(Golang)近年来在 TIOBE 指数中稳步攀升,并成功进入 Top 20 榜单,这无疑是一个值得关注的技术趋势。要全面理解这一现象,我们需要从多个维度进行分析:1. TIOBE 指数是什么?它如何衡量语言的热度?首先,理解 TI.............
  • 回答
    听到茄子患上肝硬化这个消息,我的第一反应是震惊和难以置信。毕竟,在我的印象中,茄子一直是那个充满活力、鬼点子不断、金句频出的游戏主播。他的直播风格幽默风趣,声音洪亮,仿佛永远不知疲倦,总能带领观众在欢声笑语中度过游戏时光。这突如其来的消息,像一记重锤狠狠敲在我的心上,也肯定触动了无数喜欢茄子的观众。.............
  • 回答
    “Let’s Go Brandon”这个口号在美国的流行,绝非偶然,它背后折射出的是当前美国社会深层次的政治极化、媒体生态的演变以及民众情绪的宣泄方式。要理解这个口号的起源和流行,我们需要剥开层层表象,深入挖掘其根源与影响。口号的诞生与“误读”的艺术一切的起点可以追溯到2021年10月的一场赛车比赛.............
  • 回答
    微软最新的Surface Laptop Go,怎么说呢,就像是它名字里“Go”这个词的真实写照——它就是要让你轻松上阵,随处可见。我个人对这款产品的看法,觉得它挺有意思的,尤其是对于那些预算有限但又不想妥协于微软Surface系列品牌调性的人来说,它提供了一个相当不错的切入点。首先,我们得聊聊它的定.............
  • 回答
    Jackeylove 比赛前通宵 CS:GO:职业选手训练模式的另一面?在电竞圈,选手们为了在比赛中取得好成绩,付出了常人难以想象的努力。除了日复一日的训练,他们的生活方式也常常成为话题焦点。近日,Doinb 在直播中透露,Jackeylove 在比赛前会通宵玩 CS:GO,并且他在 CS:GO 中.............
  • 回答
    亚马逊的Amazon Go无人超市,这玩意儿出来的时候,可真是搅动了一池春水,大家伙儿议论纷纷,说什么的都有。我个人觉得,这东西的出现,与其说是一次简单的零售业创新,不如说是在消费体验和技术应用层面,给了一个相当大胆的探索。它到底是个啥?首先,得明白Amazon Go到底是个什么。最直观的感受就是,.............
  • 回答
    腾讯“一起来抓妖”:一场令人扼腕的“致敬”还是赤裸裸的抄袭?2018年,一款名为《一起来捉妖》(后更名为《一起来捉妖》)的手游横空出世,迅速点燃了国内玩家的热情。其核心玩法——利用AR技术,在现实世界中捕捉、养成、对战各式各样的“妖灵”,与《Pokemon GO》如出一辙的设定,让无数玩家直呼“终于.............
  • 回答
    音数协(中国音像制品和数字出版协会)下发的关于《Pokemon GO》的通知,确实在玩家群体中引发了不少讨论,其中夹杂着一些颇具嘲讽意味的论调,比如“给《Pokemon GO》洗地的诸位脸疼么”。要理解这种声音的出现,咱们得把这事儿掰开了揉碎了说。首先,我们得明白音数协这个通知说了啥。 虽然具体细节.............
  • 回答
    《CS:GO》(CounterStrike: Global Offensive)玩家群体庞大且多元,他们对俄乌冲突的看法也因此呈现出复杂而多样的光谱。由于CS:GO本身具有全球性的玩家基础,并且其中不乏来自俄罗斯和乌克兰的玩家,这场冲突对他们而言不仅仅是新闻头条,更是一种切身相关的经历和感受。以下是.............
  • 回答
    关于11月16日即将发布的《精灵宝可梦 Let's Go 皮卡丘》和《精灵宝可梦 Let's Go 伊布》的盗版偷跑事件,这绝对是游戏界在发售前最令人扼腕叹息和深感无奈的事情之一。这件事的处理和影响,可以说是一石激起千层浪,牵扯到方方面面,也暴露了一些长久存在的行业问题。事情的经过,从公开信息来看是.............
  • 回答
    关于网传“北大文科博士在深圳大学任教经济困难,月薪13千,上网课要求学校发网络补助”的信息,需从多个角度进行分析,结合中国高校薪酬体系、地区差异及政策背景,综合判断其真实性及合理性。 一、信息真实性分析1. 来源可信度 目前尚无权威媒体或深圳大学官方声明证实该传言。网络传言往往存在夸大或误传.............
  • 回答
    关于乌克兰数学家康斯坦丁·奥尔梅佐夫(Konstantin Orelmazov)的自杀事件,目前公开的可靠信息较为有限,但结合俄乌冲突的背景和乌克兰学术界的现状,可以尝试从多个角度进行分析和探讨: 1. 事件背景的核实与可能性 身份确认:目前公开的资料中,尚未有明确的、权威的新闻来源(如BBC.............
  • 回答
    关于美国太平洋司令部空军司令威尔斯巴赫(James W. "Jim" Welsbach)提到的F35战机与歼20近距离接触的事件,目前公开信息中并无直接证据表明该言论来自美国官方渠道,因此需要从多个角度进行分析和澄清。 1. 事件背景与信息来源的可靠性 美国官方声明的缺失:截至2023年,美国.............
  • 回答
    关于您提到的“硅谷男子在妻子患病期间相亲,妻子病逝后迅速再婚并独吞200万抚恤金”的事件,目前没有权威媒体或官方渠道发布过相关具体信息。因此,这一事件的真实性、细节和法律性质尚无法确认。以下从法律、道德和社会角度进行分析,供您参考: 一、事件可能涉及的法律问题1. 重婚罪(若属实) 根据中国.............
  • 回答
    欧盟三国领导人乘坐火车前往基辅会晤泽连斯基,这一事件反映了欧洲国家对乌克兰的持续支持,以及俄乌冲突背景下国际政治的复杂动态。以下从多个角度详细分析这一事件及其背后的局势: 一、欧盟三国领导人赴基辅的背景与意义1. 象征性行动 欧盟三国(如波兰、爱沙尼亚、捷克等)领导人乘坐火车前往基辅,是近年.............
  • 回答
    中国海关查获5840块造假显卡、讯景中国官网临时关闭以及天猫旗舰店下架产品事件,涉及知识产权保护、市场秩序维护及企业合规问题,具有多重社会和行业影响。以下从多个角度详细分析: 一、事件背景与核心问题1. 海关查获假显卡 查获数量:5840块显卡,可能涉及假冒品牌(如讯景、华硕、技嘉等),或.............
  • 回答
    尹锡悦当选韩国总统是2022年韩国大选的重要结果,这一事件对韩国政治、经济、社会及国际关系产生了深远影响。以下从多个维度详细分析其背景、意义及可能的未来走向: 一、选举背景与过程1. 政治格局 在野党联盟胜利:2022年韩国大选中,由自由民主党和共同民主党组成的“在野党联盟”以压倒性优势击.............

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有