3.常⽤的垃圾收集算法有哪些?

1. 标记清除算法(Mark-Sweep)

标记-清除算法采⽤从根集合(GC Roots)进⾏扫描,对存活的对象进⾏标记,标记完毕后,再扫描整个空间中未

被标记的对象,进⾏回收。标记-清除算法不需要进⾏对象的移动,只需对不存活的对象进⾏处理,在存活对象⽐

较多的情况下极为⾼效,但由于标记-清除算法直接回收不存活的对象,因此会造成内存碎⽚。

 

2. 复制算法(Copying)  

复制算法的提出是为了克服句柄的开销和解决内存碎⽚的问题。它开始时把堆分成 ⼀个对象⾯和多个空闲⾯, 程

序从对象⾯为对象分配空间,当对象满了,基于 copying 算法的垃圾收集就从根集合(GC Roots)中扫描活动对

象,并将每个活动对象复制到空闲⾯(使得活动对象所占的内存之间没有空闲洞),这样空闲⾯变成了对象⾯,原

来的对象⾯变成了空闲⾯,程序会在新的对象⾯中分配内存。

 

3. 标记整理算法(Mark-compact)  

标记-整理算法采⽤标记-清除算法⼀样的⽅式进⾏对象的标记,但在清除时不同,在回收不存活的对象占⽤的空间

后,会将所有的存活对象往左端空闲空间移动,并更新对应的指针。标记-整理算法是在标记-清除算法的基础上,

⼜进⾏了对象的移动,因此成本更⾼,但是却解决了内存碎⽚的问题。

 

4. 分代收集算法

分代收集算法是⽬前⼤部分 JVM 的垃圾收集器采⽤的算法。它的核⼼思想是根据对象存活的⽣命周期将内存划分为

若⼲个不同的区域。⼀般情况下将堆区划分为⽼年代(Tenured Generation)和新⽣代(Young Generation),

在堆区之外还有⼀个代就是永久代(Permanet Generation)。

⽼年代的特点是每次垃圾收集时只有少量对象需要被回收,⽽新⽣代的特点是每次垃圾回收时都有⼤量的对象需要

被回收,那么就可以根据不同代的特点采取最适合的收集算法。

posted @ 2021-08-10 14:16  RainsX  阅读(69)  评论(0)    收藏  举报