3.常⽤的垃圾收集算法有哪些?
1. 标记清除算法(Mark-Sweep)
标记-清除算法采⽤从根集合(GC Roots)进⾏扫描,对存活的对象进⾏标记,标记完毕后,再扫描整个空间中未
被标记的对象,进⾏回收。标记-清除算法不需要进⾏对象的移动,只需对不存活的对象进⾏处理,在存活对象⽐
较多的情况下极为⾼效,但由于标记-清除算法直接回收不存活的对象,因此会造成内存碎⽚。
2. 复制算法(Copying)
复制算法的提出是为了克服句柄的开销和解决内存碎⽚的问题。它开始时把堆分成 ⼀个对象⾯和多个空闲⾯, 程
序从对象⾯为对象分配空间,当对象满了,基于 copying 算法的垃圾收集就从根集合(GC Roots)中扫描活动对
象,并将每个活动对象复制到空闲⾯(使得活动对象所占的内存之间没有空闲洞),这样空闲⾯变成了对象⾯,原
来的对象⾯变成了空闲⾯,程序会在新的对象⾯中分配内存。
3. 标记整理算法(Mark-compact)
标记-整理算法采⽤标记-清除算法⼀样的⽅式进⾏对象的标记,但在清除时不同,在回收不存活的对象占⽤的空间
后,会将所有的存活对象往左端空闲空间移动,并更新对应的指针。标记-整理算法是在标记-清除算法的基础上,
⼜进⾏了对象的移动,因此成本更⾼,但是却解决了内存碎⽚的问题。
4.
分代收集算法是⽬前⼤部分 JVM 的垃圾收集器采⽤的算法。它的核⼼思想是根据对象存活的⽣命周期将内存划分为
若⼲个不同的区域。⼀般情况下将堆区划分为⽼年代(Tenured Generation)和新⽣代(Young Generation),
在堆区之外还有⼀个代就是永久代(Permanet Generation)。
⽼年代的特点是每次垃圾收集时只有少量对象需要被回收,⽽新⽣代的特点是每次垃圾回收时都有⼤量的对象需要
被回收,那么就可以根据不同代的特点采取最适合的收集算法。

浙公网安备 33010602011771号