垃圾回收机制是我们在学习java编程开发语言的时候需要重点掌握的一个编程知识,而今天我们就通过案例分析来了解一下,java垃圾回收机制算法中的复制算法。

Java复制树形菜单 java复制算法_java编程

1、实现原理

在复制算法中,回收器将堆空间划分为两个大小相等的半区(semispace),分别是来源空间(fromspace)和目标空间(tospace)。在进行垃圾回收时,回收器将存活对象从来源空间复制到目标空间,复制结束后,所有存活对象紧密排布在目标空间一端,然后将来源空间和目标空间互换。

2、算法评价

复制算法主要有如下优势:

吞吐量高:整个GC算法只搜索并复制存活对象,尤其是堆越大,差距越明显,毕竟它消耗的时间只是与活动对象数量成正比。

可实现高速分配:由于GC完成后空闲空间是一个连续的内存块,在内存分配时,只要申请空间小于空闲内存块,只需要移动free指针即可。相较于标记-清理算法使用空闲链表的分配方式,复制算法明显快得多,毕竟要在空闲链表中找到合适大小的内存怎么都得遍历这个链表。

无碎片:没啥好说的。

与缓存兼容:可以回顾一下前面说的局部性原理,由于所有存活对象都紧密的排布在内存里,非常有利于CPU的高速缓存。

相较于前面的两种GC算法,其劣势主要有亮点:

堆空间利用率低:复制算法把堆一分为二,只有一半能被使用,内存利用率极低,这也是复制算法的大缺陷。

递归调用函数:复制某个对象时要递归复制它引用的对象,相较于迭代算法,递归的效率更低,而且有栈空间溢出的风险。

3、缺陷分析

复制算法的缺陷就是堆空间利用率低,因此大多数场景下,都是与其他算法搭配使用;并且我们也不是真的会把堆空间一分为二,而是根据实际情况,合理的划分。就比如,可以把堆空间分成10份,拿出2份空间分别作为From空间和To空间,用来执行复制算法,而剩下的8分则搭配使用标记-清理算法。