JAVA虚拟机【GC机制】垃圾收集算法

上篇说到,判断哪些对象是需要被回收的,本篇讨论几种垃圾收集算法的思想(包括标记-清除算法,复制算法,标记-整理算法)

1.标记-清除算法

标记-清除算法(Mark-sweep算法)主要包括标记和清除两个阶段,首先标记中需要回收的对象。在标记完成后统一回收被标记的对象如图。

标记-清除算法有两个主要问题:

  • 效率问题,标记和清除两个过程的效率不高
  • 空间问题,标记清楚之后会产生大量的碎片,导致之后无法分配较大对象

2.复制算法

将内存分为两块(Eden和Survivor),每次只使用其中的一块,当这块内容用完了,就将还存活的对象复制到另一块上面,然后再把使用过的内存空间一次性清理掉,如下图。

并不需要按照1:1的比例来划分,HotSpot虚拟机中Eden和Survivor默认比例为8:1.当Survivor空间不够用的时候,就需要以来其他内存(老年代)进行分配担保。

3.标记-整理算法

标记过程与“标记-清除”一样,后续步骤是让所有存活内存向一端移动。

4.分代收集算法

根据存活周期不同将内存划分为几块,一般分为新生代和老年代。根据各个年代的特点采用适当的收集算法。在新生代中每次有大量对象死去,所以采用复制算法。在老年代中因为对象存活率高,没有额外的担保,就采用“标记-清理”或者“标记-整理版”。

下一章:JAVA虚拟机【GC机制】垃圾收集器

发布了73 篇原创文章 · 获赞 11 · 访问量 9495

猜你喜欢

转载自blog.csdn.net/fanyuwgy/article/details/103498352