Go垃圾回收机制

1. 当前Golang使用的垃圾回收机制是三色标记法配合写屏障辅助GC,三色标记法是标记-清除法的一种增强版本。

2. 从root根出发扫描所有根对象,将他们引用的对象标记为灰色,将灰色对象置为黑色,将灰色对象引用的对象再置为灰色;以此循环,知道灰色对象队列为空。此时白色对象即为垃圾。

注:root区域主要是程序运行到当前时刻的栈和全局数据区域。

3. GC优化思路

通常小对象过多会导致GC三色法消耗过多的GPU。优化思路是,减少对象分配。

a.避免string与[]byte转化;

两者发生转换的时候,底层数据结结构会进行复制,因此导致 gc 效率会变低。

b.对于string的连接操作,少量小文本拼接,用 “+” ;大量小文本拼接,用 strings.Join;大量大文本拼接,用 bytes.Buffer。

 

4. GC触发条件

a. 超过内存大小阈值

b. 达到定时时间,阈值是由一个gcpercent的变量控制的,当新分配的内存占已在使用中的内存的比例超过gcprecent时就会触发。

c. 调用runtime.GC()时,主动触发,如果GC已经启动则跳过。

比如一次回收完毕后,内存的使用量为5M,那么下次回收的时机则是内存分配达到10M的时候。也就是说,并不是内存分配越多,垃圾回收频率越高。 如果一直达不到内存大小的阈值呢?这个时候GC就会被定时时间触发,比如一直达不到10M,那就定时(默认2min触发一次)触发一次GC保证资源的回收。

原文:https://juejin.im/post/6844903917650722829

发表评论

邮箱地址不会被公开。 必填项已用*标注