面试题 / 10 / 5 / 创建于 3年前
请在评论区留下你的答案
之前做过一些简短的总结
三色标记,黑白灰三色,初始都是白色
根据顺序,先进行根对象分析,将白色对象转为灰色,然后进行灰色分析,如果不存在引用子对象(白色),转为黑色,如果存在引用子对象,那么引用子对象变成灰色,被分析的灰色对象变为黑色,再继续灰色分析,直到不存在灰色,就将白色删除,黑色保留。
触发条件:
GC 过程会通过写屏障实现并发,但在标记开始和结束时还是会有 STW
我也说下我梳理的
Go的GC用了三色标记法、屏障技术、增量与并发实现的。
三色标记法分白色、灰色、黑色● 白色 —– 潜在的垃圾(注意是潜在)● 灰色 —- 活跃的对象● 黑色 —- 活跃的对象
三色标记法的过程是:
屏障技术是为了保证屏障前的操作优于屏障后的操作。主要是保证顺序性的。
屏障技术相当于是钩子函数,它是在用户程序读取对象、更新对象、创建对象指针时执行的一段代码,故又分为读屏障和写屏障。由于在读操作远远高于写操作所以为了性能,都是以写屏障来保证三色不变性。Go在1.8版本的时候结合了写屏障和删除写屏障。该写屏障会将被覆盖的对象标记成灰色并在当前栈没有扫描时将新对象也标记成灰色。
注意 混合屏障技术是在go 1.8版本才引入的,就是结合了写屏障和删除写屏障,目的是将被覆盖的对象标记成灰色并在当前栈没有扫描时将新对象也标记成灰色。
此技术的出现为了解决暂停时间过长的手段。由于垃圾收集器在执行阶段会暂停应用程序,但是很多实时的应用程序是无法接受长时间的暂停的,这两个技术也就应运而生。
增量收集器为了降低程序最长暂停时间的一种方案,这个方案也是非常直接,直接把这个较长的暂停时间,切分成多个小的GC时间片。在整体来看增加了总的暂停时间,但是确实是降低了最长暂停时间。
并发收集器不仅可以降低最长暂停时间而且还可以降低垃圾收集阶段的暂停时间。
最长暂停时间是指,垃圾收集器一个任务执行的最长时间总的暂停时间是指,垃圾收集器从开始暂停到结束的时间。
通过开启屏障、利用多核优势与用户程序并行执行。由于是要开启屏障,又与用户程序一起执行,所以会有额外开销,而且会增加总的暂停时间,还会影响用户程序。
黑白灰 标记 回收白色垃圾
标记清理(Mark And Clean)
用户态代码并发执行(会在清理结束阶段和标记结束阶段STW)
三色标记法
弱三色和写屏障
我觉得在回答这个面试题的时候,最关键的点应该是说到 “三色标记法” 和 “混合写屏障” 。
问:为什么1.5版本的三色标记法要重新扫描一遍栈呢? 答:因为在扫描的过程中,用户代码和标记清除算法并发执行,而插入写屏障/删除写屏障 只在堆上开启,栈上没有开启写屏障,所以栈上对象的引用可能会受到并发执行的影响,比如说:突然插入了一个可达的新对象,但是此时所有可达对象都已变成黑色,那这个新对象有可能就没有办法标记到,因此需要将栈上的元素标记为白色,再从头开始重新扫描,重新标记一遍。问:为什么栈上不开启写屏障?答:goroutine在并发的时候,大多数操作都在栈上,如果对栈开启写屏障保护的话,那性能会有严重影响。
刘丹冰大佬关于go语言gc的讲解:博客:[Golang三关-典藏版] Golang三色标记混合写屏障GC模式全分析
我要举报该,理由是:
高认可度评论:
之前做过一些简短的总结
三色标记,黑白灰三色,初始都是白色
根据顺序,先进行根对象分析,将白色对象转为灰色,然后进行灰色分析,如果不存在引用子对象(白色),转为黑色,如果存在引用子对象,那么引用子对象变成灰色,被分析的灰色对象变为黑色,再继续灰色分析,直到不存在灰色,就将白色删除,黑色保留。
触发条件:
GC 过程会通过写屏障实现并发,但在标记开始和结束时还是会有 STW
我也说下我梳理的
Go的GC用了三色标记法、屏障技术、增量与并发实现的。
三色标记法
三色标记法的颜色
三色标记法分白色、灰色、黑色
● 白色 —– 潜在的垃圾(注意是潜在)
● 灰色 —- 活跃的对象
● 黑色 —- 活跃的对象
三色标记法的过程
三色标记法的过程是:
屏障技术
屏障技术是为了保证屏障前的操作优于屏障后的操作。主要是保证顺序性的。
屏障技术相当于是钩子函数,它是在用户程序读取对象、更新对象、创建对象指针时执行的一段代码,故又分为读屏障和写屏障。由于在读操作远远高于写操作所以为了性能,都是以写屏障来保证三色不变性。
Go在1.8版本的时候结合了写屏障和删除写屏障。该写屏障会将被覆盖的对象标记成灰色并在当前栈没有扫描时将新对象也标记成灰色。
增量与并发
此技术的出现为了解决暂停时间过长的手段。由于垃圾收集器在执行阶段会暂停应用程序,但是很多实时的应用程序是无法接受长时间的暂停的,这两个技术也就应运而生。
增量收集器
增量收集器为了降低程序最长暂停时间的一种方案,这个方案也是非常直接,直接把这个较长的暂停时间,切分成多个小的GC时间片。在整体来看增加了总的暂停时间,但是确实是降低了最长暂停时间。
并发收集器
并发收集器不仅可以降低最长暂停时间而且还可以降低垃圾收集阶段的暂停时间。
最长暂停时间是指,垃圾收集器一个任务执行的最长时间
总的暂停时间是指,垃圾收集器从开始暂停到结束的时间。
通过开启屏障、利用多核优势与用户程序并行执行。由于是要开启屏障,又与用户程序一起执行,所以会有额外开销,而且会增加总的暂停时间,还会影响用户程序。
Go的版本之间差异是有的所以面试的时候一定要注意版本。
之前做过一些简短的总结
三色标记,黑白灰三色,初始都是白色
根据顺序,先进行根对象分析,将白色对象转为灰色,然后进行灰色分析,如果不存在引用子对象(白色),转为黑色,如果存在引用子对象,那么引用子对象变成灰色,被分析的灰色对象变为黑色,再继续灰色分析,直到不存在灰色,就将白色删除,黑色保留。
触发条件:
GC 过程会通过写屏障实现并发,但在标记开始和结束时还是会有 STW
我也说下我梳理的
Go的GC用了三色标记法、屏障技术、增量与并发实现的。
三色标记法
三色标记法的颜色
三色标记法分白色、灰色、黑色
● 白色 —– 潜在的垃圾(注意是潜在)
● 灰色 —- 活跃的对象
● 黑色 —- 活跃的对象
三色标记法的过程
三色标记法的过程是:
屏障技术
屏障技术是为了保证屏障前的操作优于屏障后的操作。主要是保证顺序性的。
屏障技术相当于是钩子函数,它是在用户程序读取对象、更新对象、创建对象指针时执行的一段代码,故又分为读屏障和写屏障。由于在读操作远远高于写操作所以为了性能,都是以写屏障来保证三色不变性。
Go在1.8版本的时候结合了写屏障和删除写屏障。该写屏障会将被覆盖的对象标记成灰色并在当前栈没有扫描时将新对象也标记成灰色。
增量与并发
此技术的出现为了解决暂停时间过长的手段。由于垃圾收集器在执行阶段会暂停应用程序,但是很多实时的应用程序是无法接受长时间的暂停的,这两个技术也就应运而生。
增量收集器
增量收集器为了降低程序最长暂停时间的一种方案,这个方案也是非常直接,直接把这个较长的暂停时间,切分成多个小的GC时间片。在整体来看增加了总的暂停时间,但是确实是降低了最长暂停时间。
并发收集器
并发收集器不仅可以降低最长暂停时间而且还可以降低垃圾收集阶段的暂停时间。
最长暂停时间是指,垃圾收集器一个任务执行的最长时间
总的暂停时间是指,垃圾收集器从开始暂停到结束的时间。
通过开启屏障、利用多核优势与用户程序并行执行。由于是要开启屏障,又与用户程序一起执行,所以会有额外开销,而且会增加总的暂停时间,还会影响用户程序。
Go的版本之间差异是有的所以面试的时候一定要注意版本。
黑白灰 标记 回收白色垃圾
标记清理(Mark And Clean)
用户态代码并发执行(会在清理结束阶段和标记结束阶段STW)
三色标记法
弱三色和写屏障
我觉得在回答这个面试题的时候,最关键的点应该是说到 “三色标记法” 和 “混合写屏障” 。
三句话总结
三色标记法具体过程
混合写屏障是怎么工作的
参考文章
刘丹冰大佬关于go语言gc的讲解:博客:[Golang三关-典藏版] Golang三色标记混合写屏障GC模式全分析