教育机构网站制作模板,重庆的网站建设公司,松江建设投资有限公司网站,付给招聘网站的费用怎么做分录虽然Golang的GC自打一开始#xff0c;就被人所诟病#xff0c;但是经过这么多年的发展#xff0c;Golang的GC已经改善了非常多#xff0c;变得非常优秀了。以下是Golang GC算法的里程碑#xff1a;v1.1 STWv1.3 Mark STW, Sweep 并行v1.5 三色标记法v1.8 hybrid write bar…虽然Golang的GC自打一开始就被人所诟病但是经过这么多年的发展Golang的GC已经改善了非常多变得非常优秀了。以下是Golang GC算法的里程碑v1.1 STWv1.3 Mark STW, Sweep 并行v1.5 三色标记法v1.8 hybrid write barrier经典的GC算法有三种 引用计数(reference counting) 、 标记-清扫(mark sweep) 、 复制收集(Copy and Collection) 。Golang的GC算法主要是基于 标记-清扫(mark and sweep) 算法并在此基础上做了改进。因此在此主要介绍一下 标记-清扫(mark and sweep)算法 关于 引用计数(reference counting) 和 复制收集(copy and collection) 可自行百度。标记-清扫(Mark And Sweep)算法此算法主要有两个主要的步骤标记(Mark phase)清除(Sweep phase)第一步找出不可达的对象然后做上标记。第二步回收标记好的对象。操作非常简单但是有一点需要额外注意 mark and sweep 算法在执行的时候需要程序暂停即 stop the world 。也就是说这段时间程序会卡在哪儿。故中文翻译成 卡顿 。我们来看一下图解开始标记程序暂停。程序和对象的此时关系是这样的然后开始标记process找出它所有可达的对象并做上标记。如下图所示标记完了之后然后开始清除未标记的对象然后 垃圾 清除了变成了下图这样。最后停止暂停让程序继续跑。然后循环重复这个过程直到 process 生命周期结束。标记-清扫(Mark And Sweep)算法存在什么问题标记-清扫(Mark And Sweep)算法 这种算法虽然非常的简单但是还存在一些问题STWstop the world让程序暂停程序出现卡顿。标记需要扫描整个heap清除数据会产生heap碎片这里面最重要的问题就是mark-and-sweep 算法会暂停整个整个程序。Go是如何面对并这个问题的呢三色并发标记法我们先来看看Golang的三色标记法的大体流程。首先程序创建的对象都标记为白色。gc开始扫描所有可到达的对象标记为灰色从灰色对象中找到其引用对象标记为灰色把灰色对象本身标记为黑色监视对象中的内存修改并持续上一步的操作直到灰色标记的对象不存在此时gc回收白色对象。最后将所有黑色对象变为白色并重复以上所有过程。好了大体的流程就是这样的让我们回到刚才的问题Go是如何解决 标记-清除(mark and sweep) 算法中的卡顿(stwstop the world)问题的呢gc和用户逻辑如何并行操作标记-清除(mark and sweep)算法的STW(stop the world)操作就是runtime把所有的线程全部冻结掉所有的线程全部冻结意味着用户逻辑是暂停的。这样所有的对象都不会被修改了这时候去扫描是绝对安全的。Go如何减短这个过程呢标记-清除(mark and sweep)算法包含两部分逻辑标记和清除。我们知道Golang三色标记法中最后只剩下的黑白两种对象黑色对象是程序恢复后接着使用的对象如果不碰触黑色对象只清除白色的对象肯定不会影响程序逻辑。所以 清除操作和用户逻辑可以并发。标记操作和用户逻辑也是并发的用户逻辑会时常生成对象或者改变对象的引用那么标记和用户逻辑如何并发呢process新生成对象的时候GC该如何操作呢不会乱吗我们看如下图在此状态下process程序又新生成了一个对象我们设想会变成这样但是这样显然是不对的因为按照三色标记法的步骤这样新生成的对象A最后会被清除掉这样会影响程序逻辑。Golang为了解决这个问题引入了 写屏障 这个机制。写屏障该屏障之前的写操作和之后的写操作相比先被系统其它组件感知。通俗的讲就是在gc跑的过程中可以监控对象的内存修改并对对象进行重新标记。(实际上也是超短暂的stw然后对对象进行标记)在上述情况中 新生成的对象一律都标位灰色即下图那么灰色或者黑色对象的引用改为白色对象的时候Golang是该如何操作的看如下图一个黑色对象引用了曾经标记的白色对象。这时候写屏障机制被触发向GC发送信号GC重新扫描对象并标位灰色。因此gc一旦开始无论是创建对象还是对象的引用改变都会先变为灰色。参考文献以上就是本文的全部内容希望对大家的学习有所帮助也希望大家多多支持脚本之家。