3.3 jvm的垃圾回收算法大致分为3种
3.3.1标记清除算法
基本过程:分为标记和清除两部分,首先通过一次标记,标记完成后统一进行清除操作。
优点:算法足够简单,很容易实现
缺点:标记和清除的效率都不高,
会产生大量的碎片
如下图所示
-------------华丽的分割线----------------
3.3.2复制算法
把内存一分为二,一次只使用一部分,当一般的内存使用完了,就进行一次复制,把这部分内存的对象都copy到另一半内存中,然后将另一半全部清除掉
优点:执行效率高,不用考虑碎片化问题
缺点:硬件代价大,一次值使用内存的一半
如下图所示
关于复制算法的一些补充
这种算法一半用于回收新生代,但是并不是使用50%的内存,hotspot虚拟
机采用一个Eden和2个Survivor来做复制,大小比为 Eden:Survivor1: Survivor2=8:1:1
一次使用Eden和一个Survivor,当空间使用完毕后就把这些存活的对象拷贝到另一个Survivor中,即一半情况下90%的对象中只有不到10%的对象存活,这也是新生代的特点,对象都是朝生夕死的,如果90%的对象中存活的大于10%时就要把存活的对象放入其他的内存区域,这里指老年代
-------------华丽的分割线----------------
3.3.3标记整理算法
和标记清除算法类似,但是标记完不是清除而是把对象逐个的向前移动,做个整理,最后把最后一个存活的对象后面的内存全部清除
优点:实现简单,没有内存碎片问题
缺点:标记步骤效率不高
和复制算法相比,都不存在碎片问题,但是内存利用率大大提高
如下图所示
-------------华丽的分割线----------------
3.3.4分代算法
即对不同的区域采用不同的算法,例如对新生代采用复制算法,因为这个区域的对象朝生夕死
对老年代采用标记清除或标记整理算法,因为这个区域没有内存担保
分代算法也是现代商业虚拟机采用的算法