1.标记清除算法(Mark-Sweep)
最基础的垃圾回收算法,分为两个阶段,标记和清除。
1.标记阶段标记出所有需要回收的对象
2.清除阶段回收被标记的对象所占用的空间
缺点:
1.容易产生大量的内存碎片,后续可能发生大对象不能找到可利用空间的问题
2.标记和清理两个过程效率都不高。需要扫描所有对象,堆越大,GC越慢
2.标记复制算法(Mark-Copying)
简称复制算法, 为了解决 Mark-Sweep 算法内存碎片化的缺陷而被提出。按内存容量将内存划分为等大小的两块。每次只使用其中一块,当这一块内存满后将尚存活的对象复制到另一块上去,把已使用
的内存清掉
缺点:
1.将可用内存缩小为原来的一半,代价高昂。
2.在对象存活率高的时候,效率有所下降。
3.标记整理算法(Mark-Compact)
结合了以上两个算法,为了避免缺陷而提出。标记阶段和 Mark-Sweep 算法相同,标记后不是清
理对象,而是将存活对象移向内存的一端, 然后直接清理掉端边界外的内存。
缺点:比Mark-Sweep耗费更多的时间进行整理
4.分代收集算法(Generational Collecting)
分代收集法是目前大部分 JVM 所采用的方法,其核心思想是根据对象存活的不同生命周期将内存
划分为不同的域,一般情况下将 GC 堆划分为老生代(Tenured/Old Generation)和新生代(Young
Generation)。老生代的特点是每次垃圾回收时只有少量对象需要被回收,新生代的特点是每次垃
圾回收时都有大量垃圾需要被回收,因此可以根据不同区域选择不同的算法。
1.新生代与复制算法
2.老年代与标记复制算法