go垃圾回收 | 青训营笔记

149 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第1篇笔记

一部分垃圾回收算法:

1. 标记清扫算法

思路:

把栈,数据段上的数据对象作为root,基于他们进行追踪。追踪不到的,视为垃圾。

过程:

1:垃圾回收开始时,所有数据都是白色。 2:直接追踪到的root节点标记为灰色。 3:基于一个root节点的追踪完成后,此节点被标记为黑色。(黑色代表存活数据,且不需要再追踪) 4:基于黑色节点,找到的节点标记为灰色(灰色:需要基于他们进行进一步的追踪) 当没有灰色节点时,只剩下白色与黑色节点。白色为要被删除数据。

缺点:

会造成内存碎片。 小块能存难以使用。

解决方法:

将内存化为多种大小规格。对象同规格内存快进行同一管理。可以更快的找到合适大小内存。

2. 标记整理算法

思路:

在标记清理的基础上,每删掉一个数据就让后面的数据顶上来。

缺点:

代价太大,耗时长。

复制式回收算法

思路:

0:from和t0空间大小一样,与java不同。 1:程序执行时,用from空间,垃圾回收时,用T0空间。 2:当垃圾回收开始时,将黑色数据复制到T0。 3:随后清空from。 4: 转换 FROM TO 职责。

缺点:

1:只有1半的空间可以使用。

分代回收

思想:

年轻代 常规的对象分配 由于存或的对象很少,可以用户copying,colllection 老年代: 对象区域一直或者,反复复制开销大 可以采用mark-sweep cpllection

引用计数回收

思想:

程序执行过程中,会更新对对象的引用计数。 当引用计数更新为0时,表示不再使用。可以回收他占用的内存了。 此时垃圾识别的技术,分摊到了每一次对数据对象操作中了。

优点:

引用计数发可以及时回收无用内存。

缺点:

1:高频率更新会造成很大的开销。 2:当某两个参数相互指向时,无法更新到0,是删不掉的。

STW的缺点:

1:必须暂停程序。

2:即使分为多段也有可能误删除数据。(对判断为0的数据,用户在垃圾回收后又调用。)