1.标记清除算法:分为两个阶段标记阶段和清除阶段。首先从根集合进行扫描,标记存活的对象。标记完成后,再扫描整个空间未被标记的对象并进行回收。
不足:1.效率问题,标记和清除效率不高
2.在GC的时候会造成GC停顿,响应延迟
3.由于标记-清除算法,不会对存活的对象进行移动,会导致大量的内存碎片,在需要分配大对象时,无法分配内存会触发fullgc.
2.复制算法:为解决标记算法的效率以及内存问题,诞生出复制算法,复制算法将内存分为大小相等的两块,当内存用完,会将存活的对象复制到另外一块内存,然后在把已使用过的内存空间一次清理掉,这种算法适用于存活率比较低的场景。
优点:没有标记和清除阶段,效率高。保证了内存的连续性。
缺点:需要两倍的内存。在对象存活率高的情况下比较花费时间
3.标记整理算法:让所有存活的对象都向一端移动,然后清理端边界以外的内存
优点:消除了标记清除算法的内存碎片问题,消除了复制算法空间的问题
缺点:移动对象时需要改变对象引用,
移动过程会暂停应用
4.分代收集算法:基于不同对象在不同阶段的生命周期是不一样的,因此不同生命周期的对象可以采用不同的收集的方式,以便提高效率。
新生代:对象存活率低,回收频繁,适合用复制算法效率高
老年代:对象存活高,回收不频繁,适合用标记整理算法
5.分区算法:在相同条件下,堆空间越大,一次GC时所需要的时间越长,为了更好的控制GC产生的停顿时间,将 一大块内存区域分割成多个小块,根据目标的停顿时间,每次合理回收若干个区间,从而减少GC产生的停顿。分代算法按照对象生命周期的不同划分为两个部分,分区算法将整个堆划分为 连续不同的小区间,每个小区间单独使用,单独回收,这个算法的好处可以控制一次回收多个小区间。