报名参加CloudWeGo黑客松,奖金直推双丰收! 了解详情
写点什么

Go 1.6 将进一步改进垃圾收集器

  • 2015-09-11
  • 本文字数:997 字

    阅读完需:约 3 分钟

尽管 Go 1.5 刚刚发布,仍然相对较新,但是 Go 团队已经在致力于改进其新的低延迟并发垃圾收集器,希望 Go 更适合新的应用领域。Google 工程师 Austin Clements Rick Hudson 如是

Go 1.5 用新的垃圾收集器代替了原来的STW(stop-the-world) GC,解决了延迟问题。当负载较重时,每50ms,新的GC 的活动时间可以控制在10ms 以下,从而使Go 程序在一般情况下能运行得更快些。在更极端的情况下,停顿可以从300ms 降到4ms

Go 1.6 的目标是进一步稳定 GC,并在以下几个方面做出改进:

  • 状态协调(State coordination):Go 1.5 GC 有个主要瓶颈是从 Go 1.4 继承来的,源自其集中式的 GC 协调器(coordinator),这是一个单独的 goroutine,它会将工作进一步分派给 worker goroutine 去完成。一种解决方案是用去中心化的状态机代替集中式协调器。这样修改有个额外的好处,使得重新设计标记完成屏障(mark completion barrier)成为可能,因为它已经变得非常凌乱,而且性能很差。
  • 信用系统(Credit system):Go 1.5 在两个不同的地方使用了一个信用系统:一个是确保清扫(sweeping)在一个 GC 周期和下一次触发堆操作(the next heap trigger)之间完成,一个是确保扫描(scanning)在触发堆操作(an heap trigger)和随后实现堆处理目标之间完成。改进信用系统的一种建议方法是,使其操作总是在 black 阶段进行,以避免未完成的分配操作进入下一个 GC 周期。
  • 标记结束(Mark termination):根据 Clements 和 Hudson 的介绍,在 Go 1.5 中,标记结束阶段是停顿时间的大头。这里的目标是尝试并确保大部分应用可以在 10ms 停顿的阈值下运行,这也是 Go 1.5 在很多情况下已经实现了的。希望所做修改的复杂度较低或中等,比如把 finalizer 扫描从标记结束阶段移到并发扫描,这样对于每 1GB 大小的堆,应该可以节省 1ms,以及去掉一个成本很高的计数循环,对于较大的堆,这个循环占去了标记阶段的另外一半。
  • sweeper 和 scavenger:某些程序会在 sweeper 上消耗大量时间,在这上面投入些精力,应该有性能改进。一个非常激进的方案是完全去掉 sweeper。还有一个不那么激进的方案,可以在 GC 阶段最后,尽早释放较大的对象,并且在所有的系统上支持 scavenger,不管物理页面是多大。

上面只是对计划所做改进的一个概览,欲全面了解,可以阅读原始文档。文档中还有进一步指向 GitHub issues 的链接,这些 issues 记录 了每个改变背后的理由以及建议方案。

2015-09-11 16:443377
用户头像
臧秀涛 略懂技术的运营同学。

发布了 300 篇内容, 共 139.4 次阅读, 收获喜欢 35 次。

关注

评论

发布
暂无评论
发现更多内容

这样理解Java中的函数式编程就对了

jerry

java8 函数编程

没有业务规则的技术实现

wd

吐槽

关于架构的几件小事:架构是什么

北风

架构 企业架构

Flink 作为现代数据仓库的统一引擎:Hive 集成生产就绪!

Apache Flink

大数据 flink 流计算 实时计算

spring boot 集成 elasticsearch 7.x (一)

wd

elasticsearch high level client

算法篇之数组右移

月夜

算法 数组右移

Flutter 中SharedPreferences 的初始化?

三爻

flutter android

MyBatis 3 解析mybatis-config.xml配置

杨家昌

深度解析 mybatis 初始化 XMLConfigBuilder Configuration

IT人的职业提升只靠技术精进行的通吗?

MavenTalker

程序员 程序人生 职业规划 技术人

一种消息消费失败的处理方案

redis kafka

地址收录

gogogo

iTerm2使用小技巧-密码管理器

小菜与老鸟

iTerm

快速开发那点事儿 | 选择最合适的轮子,量产跑车

Java_若依框架教程

敏捷开发 JAVA开发 RouYI 快速开发

【预告】千亿数据的潘多拉魔盒:从分库分表到分布式数据库

kimmking

分布式数据库 分库分表 分布式系统 中间件

讨论:应不应该用存储过程?

kimmking

言简意赅,聊聊RPC的123事

一叶而不知秋

RPC

专题:快速开发那点事儿 | 轮子怎么选

Java_若依框架教程

Java 敏捷开发 Ruoyi 快速开发

hive 建表语句迁移

飞哥

new[]和delete[]为何要配对使用?

泰伦卢

c c++ C#

源码分析shared_ptr实现

泰伦卢

c c++ C#

为什么很多技术都觉得前端很简单?

极客时间

大前端

自助设备系列——自助设备的春天

孙苏勇

产品

小米手机广告在日本「炸」了,背后的教训是什么?

葛仲君

产品 本地化 小米 日本 文化

基于大疆无人机SDK二次开发

sydMobile

android 无人机

第一篇InfoQ的博客

程序员小岑

写作 体验

MyBatis 3 XML配置

杨家昌

mybatis mybatis-config.xml XML配置 配置

开源一个自研的基于Netty的高性能网络通信框架

Geek_373e87

TCP dubbo Netty

MyBatis 3 解析Mapper映射配置

杨家昌

mybatis 配置 Mapper XMLMapperBuilder

央行:取消境外机构投资者额度限制,推动金融市场进一步开放

kimmking

中年危机,我们如何面对?

石云升

游戏夜读 | 有哪几种游戏玩家?

game1night

Go 1.6将进一步改进垃圾收集器_语言 & 开发_Sergio De Simone_InfoQ精选文章