匠心精神 - 良心品质腾讯认可的专业机构-IT人的高薪实战学院

咨询电话:4000806560

【技术解析】Golang中的GC机制和回收策略

【技术解析】Golang中的GC机制和回收策略

在Golang中,GC(垃圾回收)是一个非常重要的话题,因为它在程序运行时自动回收未使用的内存,避免了手动垃圾回收的繁琐和容易出错。在本文中,我们将会深入探讨Golang中的GC机制和回收策略。

Golang中的三色标记 GC

Golang中使用的是三色标记GC,这种GC算法利用了三个不同的颜色来标记内存中的对象。这三种颜色分别是白、黑和灰。

白色:表示这个对象暂时没有被访问,但是可能会被访问到。在GC开始时,所有的对象都是白色。

灰色:表示这个对象正在被访问,但是它的子对象还没有被访问。当一个对象变成灰色时,其子对象会被加入到灰色队列中。

黑色:表示这个对象已经被访问,并且它的所有子对象都已经被访问过。

Golang中的GC会遍历所有的对象,并且标记它们的颜色。然后GC会回收所有未标记的白色对象。但是在GC开始之前,所有对象都是白色的,所以需要从根对象开始,遍历所有对象,并把所有访问到的对象标记为灰色。

Golang中的根对象

在Golang中,根对象有5个,分别是:

1. 被当前运行的Goroutine引用的栈中的对象
2. 被当前运行的Goroutine引用的堆中的对象
3. 全局变量中的对象
4. 执行过程中的对象
5. Cgo调用的对象

Golang的内存分配

Golang中的内存分配采用了两种方式:小对象和大对象。

小对象:在Golang中,小于等于32KB的对象被称为小对象。对于小对象,Golang使用了一个类似于slab allocator的内存分配算法。在这种算法中,对象被分配到一个固定大小的内存块中。这种内存块被称为span,它有固定的大小(8KB或16KB)和一定数量的对象。每当对象被分配或释放时,span中的对应位图都会被修改。

大对象:在Golang中,大于32KB的对象被称为大对象。对于大对象,Golang使用了标准的malloc和free来进行内存分配和回收。

Golang中的GC触发条件

在Golang中,GC会在以下情况下进行:

1. 在堆中分配内存时,如果申请的内存超过了当前可用内存的2倍,则会触发一次GC。
2. 在GC开始前,如果所有的P的G队列都为空,则会触发一次GC。
3. 在GC开始前,如果有被标记为需要GC的对象,则会触发一次GC。

Golang中的GC优化

在Golang中,有以下几种GC优化方式:

1. 并发标记:在标记对象的过程中,Golang使用了并发的方式来提高GC的效率。
2. 增量标记:在标记对象的过程中,Golang使用了增量标记的方式来避免大规模阻塞。
3. 二进制分配:在分配内存时,Golang使用了二进制分配的方式来提高内存分配的效率。
4. 内存复制:在对象移动时,Golang使用了内存复制的方式来提高内存回收的效率。

总结

在本文中,我们深入探讨了Golang中的GC机制和回收策略。在Golang中,GC采用了三色标记GC算法,它会自动回收未使用的内存。同时,Golang还采用了多种优化方式来提高GC的效率。熟悉Golang的GC机制和回收策略对于编写高效的Golang程序非常重要。