这是我参与「第三届青训营 -后端场」笔记创作活动的第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的数据,用户在垃圾回收后又调用。)