golang学习笔记——三色标记法、强三色不变式、弱三色不变式、插入屏障、删除屏障、混合写屏障
三色标记法
Golang的三色标记法(Tri-color Marking)是一种用于垃圾回收(Garbage Collection, GC)的算法,它主要用于标记和回收不再使用的内存对象。该算法通过将对象分为三种颜色——白色、灰色和黑色,来追踪和确定哪些对象是可达的(reachable),哪些是不可达的(unreachable)即垃圾对象,从而进行回收。以下是关于Golang三色标记法的详细解释:
一、三色标记法的基本概念
三色标记法将对象分为以下三种颜色:
-
白色对象:潜在的垃圾对象,表示这些对象尚未被垃圾回收器访问到。在垃圾回收开始时,所有对象都被视为白色。当回收过程结束后,如果某些对象仍然保持为白色,则它们被认为是不可达的,即垃圾对象,可以被回收。
-
灰色对象:表示这些对象已被垃圾回收器访问到,但回收器还需要对其中的一个或多个指针进行扫描,因为它们可能还指向白色对象。灰色对象类似于一个“波面”,它们需要被进一步处理以确定其引用的对象是否可达。
-
黑色对象:表示这些对象已被垃圾回收器完全访问并扫描过,其中所有字段都已被检查。黑色对象中的任何一个指针都不可能直接指向白色对象,它们被认为是活跃的对象,不需要被回收。
二、三色标记法的执行过程
三色标记法的执行过程大致可以分为以下几个阶段:
-
标记准备阶段(Mark Setup):
- 在此阶段,垃圾回收器会进行一些准备工作,如启用写屏障(write barrier)等。写屏障是一种在对象引用发生变化时插入的额外操作,用于确保垃圾回收的正确性。
-
标记阶段(Marking):
- 从根对象(如全局变量、执行栈上的对象等)开始,将这些根对象标记为灰色,并放入待处理的灰色集合中。
- 从待处理的灰色集合中取出一个灰色对象,将其标记为黑色,并将其所有引用的白色对象标记为灰色,并放入待处理的灰色集合中。
- 重复上述过程,直到待处理的灰色集合为空。此时,所有可达的对象都已被标记为黑色,而未被标记为黑色的对象即为不可达的垃圾对象。
-
标记结束阶段(Mark Termination):
- 在此阶段,垃圾回收器会关闭写屏障,并计算下一次清理的目标和计划。
-
清理阶段(Sweeping):
- 在此阶段,垃圾回收器会并发地清理那些被标记为白色的对象,即回收不可达的垃圾对象所占用的内存空间。
三、三色标记法的优点与特点
三色标记法的优点主要包括:
- 并发性:标记过程与应用程序的执行并发进行,不会阻塞应用程序的运行,减少了垃圾回收对应用程序性能的影响。
- 高效性:通过三色标记和并发清除的策略,可以高效地进行垃圾回收,减少了停顿时间。
- 适应性:Go语言的垃圾回收器具有自适应的特性,会根据应用程序的工作负载和系统资源状况来调整垃圾回收的行为。
三色标记法的特点包括:
- 三色不变性:在并发和增量标记算法中,需要满足黑色对象不会指向白色对象的三色不变性,以确保标记的正确性。
- 写屏障技术:为了解决并发场景下的标记问题,Golang引入了写屏障技术,包括插入写屏障和删除写屏障等。
四、总结
Golang的三色标记法是一种高效、并发且适应性强的垃圾回收算法,它通过将对象分为白色、灰色和黑色三种颜色,并追踪对象的引用关系来确定哪些对象是可达的,哪些是不可达的,从而进行垃圾回收。这种算法为Golang提供了方便且高效的内存管理机制,使得程序员可以更加专注于程序的逻辑实现而无需担心内存管理的问题。
三色不变式
在Golang的GC中,三色标记法将堆中的对象分为三类:
- 黑色(Black):表示对象已被GC扫描过,且该对象及其所有可达对象均已被标记为不可回收。
- 灰色(Gray):表示对象已被GC扫描过,但尚未扫描完该对象引用的所有对象。
- 白色(White):表示对象尚未被GC扫描到,处于待扫描状态。
二、三色不变式
三色不变式是确保GC正确性的关键规则,它包括强三色不变式和弱三色不变式两种形式。
1. 强三色不变式
规则:
- 强制性不允许黑色对象引用白色对象。即,如果一个对象被标记为黑色,则它不能直接引用任何白色对象。
目的:
- 防止白色对象(即未被扫描的对象)被错误地回收,因为它们可能仍然被黑色对象(即已确定存活的对象)所引用。
实现方式:
- 通过插入屏障(Insertion Barrier)机制来实现。当对象A引用对象B时,如果对象B是白色,则将其标记为灰色,从而避免黑色对象直接引用白色对象。
2. 弱三色不变式
规则:
- 黑色对象可以引用白色对象,但要求该白色对象必须存在其他灰色对象对它的引用,或者可达它的链路上游存在灰色对象。
目的:
- 在允许黑色对象引用白色对象的情况下,通过灰色对象的保护来确保白色对象不会被错误地回收。
实现方式:
- 通过删除屏障(Deletion Barrier)机制来实现。当对象A删除对对象B的引用时,如果对象B是灰色或白色,则将其标记为灰色,从而保持灰色对象到白色对象的可达路径不被破坏。
三、三色不变式的意义
三色不变式的引入是为了解决在并发GC过程中可能出现的对象丢失或错误回收问题。通过强制性的颜色规则和屏障机制,Golang的GC能够确保在标记阶段和清理阶段不会错误地回收仍在使用的对象,同时尽量减少对应用程序性能的影响。
插入屏障、删除屏障、混合写屏障
在Golang中,垃圾回收(GC)机制是管理内存的关键部分,而插入屏障、删除屏障以及混合写屏障是GC中用于保证标记准确性的重要技术。下面将分别介绍这三种屏障机制。
一、插入屏障(Insertion Barrier 或 Reference Barrier)
1. 定义与作用
插入屏障是在对象被引用时触发的机制,它的主要作用是确保当黑色对象引用白色对象时,将该白色对象标记为灰色。这样做是为了满足强三色不变式,即不允许黑色对象直接引用白色对象,从而避免有效数据被错误地回收。
2. 工作原理
- 当一个黑色对象A引用一个白色对象B时,插入屏障会被触发。
- 插入屏障将白色对象B标记为灰色,并将其加入到灰色对象的集合中。
- 这样,在后续的GC过程中,灰色对象B会被进一步扫描,以确保其引用的所有对象都被正确标记。
3. 优缺点
- 优点:确保了强三色不变式的成立,提高了GC的准确性。
- 缺点:插入屏障可能会降低程序的性能,因为它需要在每次对象引用时都进行检查和标记操作。此外,由于栈需要更高的性能要求,插入屏障通常只应用于堆内存空间,而不应用于栈内存空间。
二、删除屏障(Deletion Barrier)
1. 定义与作用
删除屏障是在对象被删除(即其引用被清除)时触发的机制。它的主要作用是将被删除的对象(如果它是灰色或白色)标记为灰色,从而保护从灰色对象到白色对象的可达路径不会断裂。这满足了弱三色不变式的要求。
2. 工作原理
- 当一个对象A的引用被删除,且该对象A是灰色或白色时,删除屏障会被触发。
- 删除屏障将对象A标记为灰色,并将其加入到灰色对象的集合中。
- 这样,在后续的GC过程中,对象A仍然会被扫描,以确保其引用的其他对象(如果有的话)也被正确标记。
3. 优缺点
- 优点:减少了STW(Stop The World)的时间,因为删除屏障允许在GC过程中并发地处理对象的删除操作。
- 缺点:回收精度较低,一个对象即使被删除了最后一个指向它的指针,也可能在下一轮GC中才被清理掉。
三、混合写屏障(Hybrid Write Barrier)
1. 定义与作用
混合写屏障是插入屏障和删除屏障的结合体,它结合了两种屏障的优点,旨在提高GC的效率和准确性。混合写屏障通过减少STW的时间和提高GC的并发性,来优化垃圾回收过程。
2. 工作原理
- 在GC开始时,混合写屏障首先应用删除屏障的逻辑,将可能被删除的对象标记为灰色。
- 在GC过程中,当黑色对象引用白色对象时,混合写屏障会应用插入屏障的逻辑,将白色对象标记为灰色。
- 这样,混合写屏障既保证了强三色不变式的成立(通过插入屏障),又减少了STW的时间(通过删除屏障和并发处理)。
3. 优缺点
- 优点:
- 减少了STW的时间,提高了程序的并发性能。
- 提高了GC的准确性和效率,通过结合插入屏障和删除屏障的优点。
- 缺点:
- 实现复杂度较高,需要同时处理插入和删除两种屏障的逻辑。
- 在某些情况下,可能需要额外的同步机制来确保屏障的正确执行。
总结
Golang中的插入屏障、删除屏障和混合写屏障是GC机制中用于保证标记准确性的重要技术。它们各自具有不同的优缺点,但共同的目标是提高GC的效率和准确性。在实际应用中,Golang的GC机制会根据具体情况选择合适的屏障策略来优化垃圾回收过程。
原文地址:https://blog.csdn.net/e891377/article/details/140669394
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!