Go语言带你一起飞--Go的垃圾回收

原创 2018年04月16日 15:56:16

        相信熟悉某一门编程语言的攻城狮们,对它的垃圾回收一定不陌生,是不是曾经不止一次地受到jvm给准备的oom彩蛋!就问你:惊不惊喜,惊不惊悚?!

      前段时间自己研究了一下Go语言,时隔这么些天,总该有这么一个机会将自己对Go的认知做一下沉淀,但相对于之前的系列博客,脑门一热打算先从它的垃圾回收开始整理,这里将结合一些java中的垃圾回收算法来做对比;对于java,我们可以从多个角度来看它的垃圾回收算法:

▶ 按照基本回收策略来分,有引用计数、标记-清除、复制、标记-整理

▶ 按照分区对待的方式来分,有增量收集和分代收集两种;

▶ 按照系统线程来分,有串行收集和并行收集,并发收集三种;【详情见:jvm调优总结(2)

      在Go中的垃圾回收算法和jvm的垃圾回收算法一样,也是从“stop the world”开始的,并且Go中的GC是固定每分钟执行一次,而每次GC的消耗时间是与垃圾回收的对象数量相关的,垃圾回收时会扫描需要回收的内存区域,如果发现对象的内容汇总包含指针,就会递归地进行扫描;所以从一定程度上,Go中的垃圾回收更偏向于标记-清除算法;

     在Go的1.3版本开始对Go的gc性能进行持续的改进和优化,在该版本中,Go runtime分离了mark和sweep的操作,和之前版本一样,在gc之前需要先暂停所有任务并启动mark(stop the world),mark 完之后马上重新启动被暂停的任务,然后让sweep的任务和普通协程(比线程粒度更小的单位一样并行的和其他任务一起执行;

    在之后的1.4版本没有对GC做太多变更,只是将之前很多的原生c语言变换为Go语言来实现,对于go来说这次的变动可以更好更精确地实现gc;因为C语言在实现GC时不能获取到内存的对象信息,因此无法区分普通变量和指针;

    1.5版本中,改进的主要目标是减少延迟,因此实现的垃圾回收器是“非分代、非移动、并发的、三色的标记清除垃圾收集器”,而三色标记法的mark操作是可以渐进执行的而不需要每次都扫描整个内存空间,进而减少stop the world的时间。

     从整体上来讲,go语言中的GC有了很大的改进,但是还需要在优化的路上继续前进;



版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/YSC1123/article/details/79961225

Go 语言的垃圾回收算法被吹过头?与Java比如何?

Go语言正在构建的垃圾收集器(GC),似乎并不像宣传中那样的,技术上迎来了巨大突破。那么,与Java语言作对比之后,该怎么选择呢?...
  • qq_15427331
  • qq_15427331
  • 2017-01-19 10:58:19
  • 939

[转]Go 的垃圾回收机制在实践中有哪些需要注意的地方?

来源:http://www.zhihu.com/question/21615032不想看长篇大论的,这里先给个结论,go的gc还不完善但也不算不靠谱,关键看怎么用,尽量不要创建大量对象,也尽量不要频繁...
  • heiyeshuwu
  • heiyeshuwu
  • 2013-09-09 14:09:57
  • 2146

Go1.6与JVM CMS的垃圾回收对比

自从Go1.5引入了真正的并发GC后, Go1.6进一步进行了优化,使得Go在上百G级的堆大小时依然能将STW时间控制在20ms以内: 来自:https://link.zhihu.com/?targ...
  • tracker_w
  • tracker_w
  • 2016-04-13 15:03:59
  • 2851

Go 的垃圾回收机制在实践中有哪些需要注意的地方?

之前回答问题的时候Go还处在1.1版本,到了1.2和1.3,Go的GC跟踪命令和GC内部实现已经有一些变化,并且根据评论中的反馈,这边一并做补充说明。 Go 1.2之后的GC跟踪环境变量已经改为...
  • wkyb608
  • wkyb608
  • 2015-08-22 11:29:39
  • 932

golang的垃圾回收(GC)机制

请先阅读 golang的goroutine调度机制 然后再到这里   golang的垃圾回收采用的是 标记-清理(Mark-and-Sweep) 算法 就是先标记出需要回收的内存对象快,然后在清理掉;...
  • liangzhiyang
  • liangzhiyang
  • 2016-09-26 14:35:52
  • 7569

一个专家眼中的Go与Java垃圾回收算法大对比

高可用架构 2016-12-28 10:32 我最近看过一堆宣传 Go 语言的最新垃圾收集器的文章。 其中一些文章来自 Go 项目本身。 他们声称 GC 技术发生了根本性的突破。 以下是 20...
  • u011277123
  • u011277123
  • 2017-01-03 09:41:07
  • 2803

什么是垃圾回收(golang)?

http://www.open-open.com/lib/view/open1435846881544.html 在实际使用go语言的过程中,碰到了一些看似奇怪的内存占用现象,于是决定对go...
  • caoshulin1989
  • caoshulin1989
  • 2016-06-14 14:38:31
  • 288

Golang语言——垃圾回收

垃圾回收涉及到:阈值触发,并行标记,并发清理。或者:定期强制回收,释放物理内存。垃圾回收效率总是Go版本升级的核心问题。阈值或强制回收如下图 1:并行标记如下图2:串行或与用户逻辑并发执行如下图3:如...
  • u012798391
  • u012798391
  • 2016-10-20 14:37:20
  • 347

Go 并发 、并行、线程池

1. Go 中类线程基础概念     Goroutin 概念: Go语言中有个概念叫做goroutine, 这类似我们熟知的线程,但是更轻。   信道: 信道是什么?简单说,是goroutine之间互...
  • sun_hongtao
  • sun_hongtao
  • 2017-08-09 10:16:42
  • 586

go编程基础 讲义涉及源代码

  • 2017年10月13日 23:11
  • 14KB
  • 下载
收藏助手
不良信息举报
您举报文章:Go语言带你一起飞--Go的垃圾回收
举报原因:
原因补充:

(最多只允许输入30个字)