# 对象信息
对象信息分为对象头和域两部分,对象头持有对象的一些描述信息,比如tag标记(用于标识对象是否已经被复制),forwording(记录复制后的对象位置,因为复制过程是图的遍历过程,被复制对象可能再次被访问到)等;而域则是保存有对象的属性信息;
# 复制算法
将对空间划分为From和To两块等大区域,GC时将From区域存活对象移动到To区域。在执行GC操作时,遍历GC Root,以深度遍历方式(中序遍历)查到并移动存活对象。对于具体的每一个存活对象,首先判断tag标记是否已经被设置为copied值,如果是,则至二级返回forwarding值;反之,首先将tag标记设置为copied值,然后将对象拷贝至To区域(此时拷贝至To区域的对象中的属性还指向From区域对象)和设置forwarding值,之后以此拷贝对象属性(子对象)并更新对应属性指向(此时对象属性指向To区域中对象),最后返回fowading值。
# 优缺点
优点(与标记-清除算法比较):吞吐量高(无清除阶段),可高速分配(不用遍历空闲链表),无碎片化,与缓存兼容(gc后父子对象更靠近,便于缓存);
缺点:对利用率低(浪费了to空间),不兼容保守式GC(会移动对象位置),递归调用(栈溢出风险,递归速度低于迭代);
# 改进措施
1 cheney式复制算法:将递归复制(深度遍历)改为迭代复制(广度遍历,引入队列),提高遍历速度,失去缓存兼容;