Golang的垃圾回收(GC)机制是其运行时系统的重要组成部分,旨在自动管理内存分配和释放,减少开发者的负担并提高程序运行的安全性和效率,GO的GC是一种并发、三色标记-清除垃圾回收期,它在不影响程序性能的前提下,尽可能高效的回收不再使用的内存。
GO的GC机制概述
1、GO-GC并发性: GO的GC是并发的,意味着它可以在应用程序线程继续执行的同时运行。这减少了GC暂停时间(GC pause),从而提高了应用程序的响应性和吞吐量。
2、三色标记-清除算法: 白色:表示尚未被扫描对象,这些对象可能是垃圾。 黑色:表示已经完全扫描过的对象,这些对象及其引用的对象否已经被标记为存活。 灰色:表示已经被发现尚未完全扫描的对象,既它们可能还有未被扫描的引用。
3、写屏障(Write Barrier):为了确保并发 GC 的正确性,Go 引入了写屏障。写屏障是一种机制,它在每次修改指针时插入额外的检查,以确保 GC 不会错过任何新创建的引用。写屏障使得 GC 可以安全地与应用程序并发运行,而不会导致数据不一致。
4、分代收集(Generational Collection):虽然 Go 的 GC 并不是严格意义上的分代收集器,但它确实利用了一些分代收集的思想。Go 将对象分为两类: 年轻代(Young Generation):新分配的小对象通常会被放置在年轻代中。年轻代中的对象生命周期较短,因此 GC 会更频繁地扫描这一区域。 老年代(Old Generation):存活时间较长的对象会被移动到老年代。老年代中的对象生命周期较长,因此 GC 会较少地扫描这一区域。
5、GOMAXPROCS 和 GC 调度:Go 的 GC 线程数与 GOMAXPROCS 设置有关。GOMAXPROCS 决定了 Go 程序可以同时运行的最大 Goroutine 数量。GC 线程会根据 GOMAXPROCS 的值进行调度,以确保 GC 线程与应用程序线程之间的平衡。