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