GC(垃圾回收)准确式垃圾回收算法
准确式GC
准确式GC和保守式GC的不同点在于,准确式GC能准确识别指针和非指针来经行垃圾回收。创建正确的根有多种方式,但是这些都需要语言处理程序的支援。
方法一:打标签
打标签的目的在于明确的对根里所有的指针和非指针明确的区分开来。我们以最基本的第一位作为标签的方法。在32bCPU下,指针的值是4的倍数,低2位一定是0,我们利用这特性具体打标签的方法如下:
1,将非指针(如int)左移一位
2,将低1位至为1
注意:在对数值也就是非指针左移时注意不要让数值溢出,若发生溢出则换位更大的数据类型,例如Int换位Long
这里打标签这两步都是由语言处理程序处理的。根据打完这个表情GC就可以精准的识别根里指针和非指针变量。但是除了识别变量,在计算时必须将数据还原,也就是取消标签。
方法二:不把寄存器和栈当作根。上文提到,寄存器和调用栈里存在的都是不明确的根,我们这里都不把寄存器和栈当作根就可以省去很多麻烦。这种方法似乎有点投机取巧,解决不了问题就避免问题的感觉,但是事实上很有用,许多语言也利用这种方法例如:Rubiniius。
准确式GC可以精准识别指针,GC之后堆只剩活动的对象。此外,复制等移动算法都依赖准确式GC。缺点:是语言处理程序的支援,对应保守式简单的优点这里就是麻烦,并且例如打标签和取消标签这就影响语言处理程序整体速度。