Go的垃圾回收机制| 青训营笔记

123 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 15 天

Go语言使用了一种称为"并发标记清除"(Concurrent Mark and Sweep,简称CMS)的垃圾回收机制,用于自动回收不再使用的内存。

该垃圾回收机制主要由以下两个阶段组成:

  1. 标记(Mark)阶段

在标记阶段,垃圾回收器会标记所有活跃对象,即那些在程序运行时仍然被引用的对象。它从程序根对象(例如全局变量)开始,递归地遍历整个对象图,标记所有被引用的对象,并将它们打上一个特殊的标记,表示这些对象是活跃的。

在Go语言的垃圾回收机制中,标记阶段是通过并发执行的,也就是说,垃圾回收器会和程序运行在同一时间段内执行。这使得标记阶段可以在几乎不影响程序性能的情况下完成。

  1. 清除(Sweep)阶段

在标记阶段完成后,所有未被标记的对象都可以被认为是垃圾。在清除阶段,垃圾回收器会回收这些垃圾对象的内存,并将这些内存标记为可用的。垃圾回收器会在一组空闲列表中维护这些可用的内存块,以备将来分配给新的对象。

在Go语言的垃圾回收机制中,清除阶段也是通过并发执行的。当一个 goroutine(Go语言中的轻量级线程)需要分配内存时,它会从空闲列表中获取一个可用的内存块,而不需要等待垃圾回收器完成清除阶段。

总体来说,Go语言的垃圾回收机制具有以下几个优点:

  1. 并发执行:Go语言的垃圾回收机制是并发执行的,因此不需要暂停程序执行,这使得程序的响应性和吞吐量都能得到保证。而其他语言的垃圾回收机制通常需要在执行垃圾回收时停止程序执行,这会导致程序暂停,影响响应时间和吞吐量。
  2. 分代回收:Go语言的垃圾回收机制采用分代回收策略,即将内存分为几个代,每一代的内存块有不同的存活时间。这样,可以针对不同生命周期的对象采用不同的回收策略,提高垃圾回收的效率。而其他语言的垃圾回收机制通常不具备分代回收的能力。
  3. 空间整合:Go语言的垃圾回收机制在回收垃圾的同时,还会尝试将不连续的内存块合并成连续的内存块,从而减少内存碎片。而其他语言的垃圾回收机制通常不会进行空间整合。
  4. 低停顿时间:由于并发执行和分代回收的特点,Go语言的垃圾回收机制可以实现非常低的停顿时间,通常在几十毫秒以内。而其他语言的垃圾回收机制通常需要较长的停顿时间,有时甚至会导致程序挂起。

Go语言的垃圾回收机制具有高效、低停顿时间、并发执行、分代回收、空间整合等特点,可以提高程序的可用性和可靠性。