上一篇:006-JVM - 清除阶段算法之一:标记 - 清除算法 Mark-Sweep juejin.cn/post/690861…. 背景为了解决标记 - 清除算法在垃圾收集效率方而的缺陷 M.L.Minsky 于 1963 年发表了著名的论文, “ 使用双存储区的 Lisp 语言垃圾收集器 CA LISP Garbage CoIIector Algorithm Using SeriaI Secondary Storage 。
为了解决标记 - 清除算法在垃圾收集效率方而的缺陷 M.L.Minsky 于 1963 年发表了著名的论文, “使用双存储区的 Lisp 语言垃圾收集器 CA LISP Garbage CoIIector Algorithm Using SeriaI Secondary Storage 。M.L.Minsky 在该论文中描述的算法被人们称为复制 (copying) 算法, 它也被 M.L.Minsky 本人成功地引入到了 Lisp 语言的一个实现版本中。
将活着的内存空间分为两块, 每次只使用其中一块, 在垃圾回收时将正在使用的内存中的存活对象复制到未被使用的内存块中, 之后清除正在使用的内存块中的所有对象, 交换两个内存的角色, 最后完成垃圾回收。
可以使用指针碰撞的算法,进行新对象的存放。 优点: 没有标记和清除过程, 实现简单, 运行高效 复制过去以后保证空间的连续性, 不会出现 “碎片” 问题。 缺点: 此算法的缺点也是很明显的, 就是需要两倍的内存空间。 对于 G1 这种分拆成为大量 region 的 GC , 复制而不是移动, 意味着 GC 需要维护 region 之间对象引用关系, 不管是内存占用或者时间开销也不小。 特别的: 如果系统中的存活对象很多, 复制算法需要复制的存活对象数量就会很大。所以说存活的对象非常低才行,(应用:比如 s0 s1 区,朝生夕死)。 在新生代, 对常规应用的垃圾回收, 一次通常可以回收 70% - 90% 内存空间。回收性价比很高。所以现在的商业虚拟机都是用这种收集算法回收新生代。
比 Mark-Sweep 有进步,但是二者均有市场。各有各的用处!