复制算法

概念

将堆分为大小相等的两个空间,From空间和To空间。
利用From空间进行分配。当From空间被完全占满时,GC会将活动对象复制到To空间。当复制完成后,该算法会把From空间和To空间互换,GC也就结束了。

过程

垃圾收集器将根直接引用的对象复制到To区域并设置旧对象的copied标记为true,设置旧对象的forwarding指针指向To空间的新对象,并且遍历新对象的子对象,重复上述操作,如果遇到的对象copied为true则直接返回forwarding指针,更新旧的引用(From空间的对象)至新的引用(To空间的对象),否则重复上述复制根直接引用的对象的复制过程。直至整个根引用对象复制结束。

优点

相比于标记-清除算法,只需要搜索活动对象,所以其吞吐量优秀。
GC复制算法不需要空闲链表,使用的是连续的内存空间,因此其分配快很多。
不会发生碎片化。
与缓存兼容,因为复制的时候是深度优先搜索,会将对象和其引用的子对象放在相邻的内存空间。

缺点

内存使用率低,仅为堆空间的一半。
不兼容保守式GC算法。
递归调用有会导致栈溢出

扩展

1、可以通过广度优先搜索的方式避免栈溢出,不过无法有效使用缓存
2、可以使用近似深度优先搜索方式进行复制,可以利用缓存。该算法在同一块page页中进行局部广度优先搜索。跨page时进行全局广度优先搜索。
 
 
 
 
 
 
posted @ 2022-07-14 10:55  bavaria  阅读(135)  评论(0)    收藏  举报