JVM垃圾收集算法整理
JVM中的垃圾收集算法重要包含标记-清除算法,复制算法,标记-整理算法,分代收集算法。
标记-清除算法
该算法分为“标记前”和“清除”阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有标记的对象,标记的过程采用的是可达性分析算法。它是最基础的收集算法,后续的算法都是对其进行改进得到的,该算法主要有两个明显的不足:
1.效率问题
标记和清除的效率都不高,清除的过程是将标记的对象一个一个的清除。
2.空间问题
由于清除的对象分布在内存的各个位置,清除后会产生大量内存碎片,大对象在进入时可能会找不到合适的位置,从而引发第二次GC,GC也需要消耗时间
复制算法
为了解决效率问题,复制算法出现了。它可以将内存分为大小相等的两块,每次使用其中的一块。当这一块的内存使用完的时候,就将还存活的对象复制到另一块,然后把使用的空间一次性清理掉,这样每次使用内存回收都是对其中的一半进行回收
标记-整理算法
标记过程和标记-清除算法一样,只不过清除的时候不是直接清除,而是把所有存活对象向一端移动,清除的时候直接清除端边界以外的内存
分代收集算法
这也是当前虚拟机采用的算法,这种算法没什么新的思想,只是根据对象生存时间的不同将内存分为新生代和老年代,对不同的内存采用不同的收集算法。
比如在新生代中,每次GC都会有大量的对象死去,只需要付出少量空间进行对象的复制就可以完成,所以一般用复制算法;而老年代中,一般存活几率都比较大,也没有额外的空间可以分配,所以一般使用标记-清除或者标记-整理算法。