目录
一、标记-清除算法
二、标记-整理算法
三、复制算法
四、分代收集算法
jvm中的五种垃圾回收算法,分别是:(1)标记-清除算法(2)标记-整理算法(3)复制算法(4)分代收集算法
一、标记-清除算法
此算法分为标记和清除两个阶段,首先标记出要存活的对象,然后统一回收所有未标记的对象。
缺点:
(1)标记和清除的效率都交低。
(2)如图可以看出,算法执行后会产生大量的不连续的空间碎片,对后面申请大的连续空间时就会产生影响。
二、标记-整理算法
同样也分为标记和整理两个阶段,标记阶段和标记-清除算法一样,首相标记出要存活的对象,然后让标记的对象向一端移动整理,最后回收边界以外的内存。
优点:相比于标记-清除算法,解决了大量不连续的碎片内存问题。
缺点:在移动局部对象的过程中,降低了效率。
三、复制算法
内存分配为大小相等的两块,每次使用其中的一块;然后罢使用的那块内存中存活的对象复制到另一块去,使用的那块空间一次清理掉。(就是平均分两成两块,一块满了,把存活的复制到立一块去,清理掉原来的)
缺点:这样会使内存缩小一半(因为平均分成两份了)
使用复制算法来回收新生代(yong generation如下图,主要发生在S0和S1):
1、新生代(yong generation)内存分为两块,一块较大的endn空间和两块较小的survivor空间。
2、每次使用Eden和一块Survivor(比如S0),当进行回收时,将Eden和Survivor中还存活的对象一次性复制到另一个Survivor(比如S1)空间上。然后,清理掉Eden和刚刚使用过的Survivor空间。(其中HotSpot虚拟机默认Eden和Survivor的大小比例为8 : 1)
四、分代收集算法
分代收集一般包括年轻代、老年代 和 永久代。
新生代(Young generation)
由第三点我们知道,新生代一开使使用的是endnr内存,当内存空间使用满了之后推向S0,在S0满了之后,进行一次GC清理,还有剩余的存活对象就复制到另外一个S1内存中,清除S0内存,然后继续接受endn分配的对象(这里使用复制了的S1),当S1满级了之后,又GC清除,剩余存活对象又复制到S0,依次反复,经历了15次GC的对象就会推到老年代。(简记:endn满推向S0,S0满GC,复制到S1,S1满GC,复制到S0,........15次后,老年代)
其中大部分对象在新生代就会消失,这个过程叫做minor GC。
又大量的对象在这里消失死亡,适合采用复制算法回收。
老年代(old generation)
在新生代存活下来的对象,会被拷贝到老年代,所以内存空间会比较大,而且在老年代中进行GC的次数没有新生代那么多,对象从老年代中消失的过程,可以称之为major GC(或者full GC)
对象存活率高,适合使用标记-清理算法和标记-整理算法进行回收