JVM高级特性-四、垃圾收集算法
一、标记-清除算法
标记清除算法是最基础的收集算法,执行过程就名字一样,分为两个阶段,标记和清除
首先对需要回收的对象进行标记,标记完成后统一对已标记对象进行回收,如下图所示。
具体标记过程的介绍可以看上一篇垃圾收集之判断对象存活算法中的“可达性分析”中介绍的
回收前状态
回收后状态
不足:
1.效率不高,标记和清除两个动作的效率均不是太高
2.从图中可以看到,清除后内存中会存在大量碎片,这样带来的坏处就是在给大对象分配内存空间时
可能导致找不到足够大的连续空间,而导致提前发生一次GC。
二、复制算法
复制算法是原理是把内存空间分成大小相同的两份,当需要进行垃圾收集时,将使用完的内存中的存活对象
复制到另一块内存上,之后将前面那块内存清空。如下图所示
回收前状态
回收后状态
优点:复制算法的效率较高
不足:这种算法牺牲的空间较大,毕竟要讲内存可使用空间变为了原来的一半
三、标记整理算法
这是一种在老年代常用的算法,因为老年代对象存货时间长。
标记整理算法标记过程与标记-清理算法一致,但后续步骤不同,标记整理算法是将存活对象向一端移动,
然后清理掉存活端边界另一端的所有内存,如下图
回收前状态
回收后状态
四、分代收集算法
当前的虚拟机都是使用的分代收集算法,这种算法是按对象的存活周期不同将内存划分为不同区域
一般把java堆分为新生代和老年代
五、新生代的算法使用
商业虚拟机中,都是使用复制算法对新生代进行垃圾回收,原因是新生代中的对象98%存活时间很短暂,
因此,也并不需要将内存分为同样大小的两块,只需给存活对象留出较小空间用于复制即可。因此,通常将
内存分为较大的Eden区和两块较小的survivor区,当回收时,将eden区和survivor区的存活对象复制到另一块
survivor区,然后对eden和使用过的servivor进行清理即可。