JVM的垃圾回收算法
1.标记-清除(mark-sweep)算法
(1)标记阶段:从根集合(GC Roots)开始,递归标记所有可达的对象。
(2)清除阶段:遍历整个堆空间,回收未被标记的对象。
缺点:清除之后会产生内存碎片。
上述的可达表示的是GC的可达性算法:
这个算法的基本思路就是通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连(用图论的话来说,就是从GC Roots到这个对象不可达)时(下面链接中有图),则证明此对象是不可用的。
这段解释的原文链接:https://blog.csdn.net/ystyaoshengting/article/details/104415088
2.复制(Copying)算法
复制算法将内存分为两个区域。当活动区域用完时,将存活的对象复制到另一块区域,
然后清空当前区域。
(1)复制阶段:将所有存活的对象从正在使用的区域复制到空闲区域。
(2)交换阶段:清空当前正在使用的区域,而后交换正在使用区域与空闲区域的角色。
优点:不会产生内存碎片。
缺点:需要使用两倍的内存空间。
3.标记-压缩(mark-Compact)算法
该算法结合了上述两种算法的优点。它在标记阶段标记所有存活的对象,然后在压缩阶段将
存活对象移动到对的一端,释放出连续的内存空间。
(1)标记阶段:标记所有的存活的对象。
(2)压缩阶段:将存活对象移动到堆的另一端,按顺序排列。释放出其余连续的内存空间。
4.分代收集算法
分代收集算法基于对象的存活时间,将堆内存分为年轻代、老年代以及永久代。各代分别使
用不同的收集算法。
(1)年轻代:对象的生命周期短,频繁发生GC,使用复制算法。
(2)年老代:对象的生命周期长,使用标记-压缩算法。
(3)永久代:存储类的元数据(JDK8以后被元空间*(Metaspace)替代)。