目录

一、标记-清除算法

二、标记-整理算法

三、复制算法

四、分代收集算法


jvm中的五种垃圾回收算法,分别是:(1)标记-清除算法(2)标记-整理算法(3)复制算法(4)分代收集算法

一、标记-清除算法

java垃圾处理机制 java垃圾算法_jvm

 此算法分为标记清除两个阶段,首先标记出要存活的对象,然后统一回收所有未标记的对象。

缺点:

(1)标记和清除的效率都交低。

(2)如图可以看出,算法执行后会产生大量的不连续的空间碎片,对后面申请大的连续空间时就会产生影响。

二、标记-整理算法

java垃圾处理机制 java垃圾算法_java垃圾处理机制_02

 同样也分为标记整理两个阶段,标记阶段和标记-清除算法一样,首相标记出要存活的对象,然后让标记的对象向一端移动整理,最后回收边界以外的内存。

优点:相比于标记-清除算法,解决了大量不连续的碎片内存问题。

缺点:在移动局部对象的过程中,降低了效率

三、复制算法

java垃圾处理机制 java垃圾算法_jvm_03

内存分配为大小相等的两块,每次使用其中的一块;然后罢使用的那块内存中存活的对象复制到另一块去,使用的那块空间一次清理掉。(就是平均分两成两块,一块满了,把存活的复制到立一块去,清理掉原来的)

缺点:这样会使内存缩小一半(因为平均分成两份了)

使用复制算法来回收新生代(yong generation如下图,主要发生在S0和S1):

1、新生代(yong generation)内存分为两块,一块较大的endn空间和两块较小的survivor空间。

2、每次使用Eden和一块Survivor(比如S0),当进行回收时,将Eden和Survivor中还存活的对象一次性复制到另一个Survivor(比如S1)空间上。然后,清理掉Eden和刚刚使用过的Survivor空间。(其中HotSpot虚拟机默认Eden和Survivor的大小比例为8 : 1

四、分代收集算法

java垃圾处理机制 java垃圾算法_老年代_04

 分代收集一般包括年轻代、老年代 和 永久代

新生代(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)

对象存活率高,适合使用标记-清理算法标记-整理算法进行回收