Sticky引用计数法
在典型的引用计数法中我们为每个对象头是设置一个位宽。通常例如:32b的计算机位宽设为32b,64b的计算机位宽设为64b,而位数越多则越占用内存空间这是一个弊端,另外我们从计算机组成原理知道,32b计数范围为:0~-1.。
那么我们看可以想到,若是被引用的大小超过-1.则存在爆表的现象。
第一, 针对这种现象我们可以放在视为长期活动的对象不管。实验表明,更多的对象一创建就死了,而爆表的对象在程序中肯定是非常重要的范围。(我们知道溢出后数值改变的原理)
第二,我们可以结合GC标记-清除算法进行管理。但我们这里与典型的标记-清除算法不同。在标记阶段,我们从根出发以有向图DFS算法进行遍历并且每次遍历过的对象计数器+1。代码如下:
在清除阶段,程序会搜索(又用到了搜索算法)整个堆,回收根不可达的对象即计数器为0。我们可以从计组中内存地址原理部分轻易读懂代码中循环部分的条件