JVM学习笔记第43天-复制算法及优缺点
一、复制算法
背景
为了解决标记-清除算法在垃圾收集效率方面的缺陷,M.L.Minsky于1963年发表了著名的论文,“使用双存储区的Lisp语言垃圾收集器CA Lisp Garbage Collector Algorithm Using Serial Secondary Storage”。M.L.Minsky在论文中描述的算法被人们称为复制(Copying)算法,它也被M.L.Minsky本人成功的引入到了Lisp语言的一个实现版本中。
核心思想
将活着的内存空间分为两块,每次只使用其中一块,在垃圾回收时将正在使用的内存中的存活对象复制到未被使用的内存块中,之后清除正在使用的内存块中的所有对象,交换两个内存的角色,最后完成垃圾回收。
二、内存图示
三、优缺点
优点
- 没有标记和清除,实现简单,运行高效
- 复制过去以后,保证空间的连续性,不会出现“碎片”问题;
缺点
- 此算法的缺点也是很明显的,就是需要两倍的内存空间。
- 对于G1这种分拆成大量region的GC,复制而不是移动,意味着GC需要维护region之间对象引用关系,不管是内存占用或者时间开销也不小。
特别提示
如果系统中的垃圾对象很多,复制算法需要复制的存活对象数量并不会太大,或者说非常低才行。