目录
一、标记-清除算法
最基础的算法。如名称一致,分为两个阶段:标记、清除。先标记需要回收的对象,然后对标记的对象进行回收
示意图
回收之前
回收之后
缺点:1、效率问题:标记和清除的效率都不高
2、空间问题:当把对象回收后,会造成大量的不连续内存碎片,当有大对象创建并找不到连续的足够大的内存时,会重新触发GC动作。
二、复制算法
复制算法是将内存分为两块大小相等的空间,每次使用时只使用其中一块,回收对象时,将存活的对象复制到另一块空间中,然后把当前空间一次清除。
示意图:
回收之前
回收之后
缺点:1、当对象存活率高时,需要复制的对象过多会造成效率低 2、内存只能使用一半,代价太高
实际使用中,内存空间不是按照1:1的比例进行分配。而是分成一个较大的Eden和两个较小的Survivor区域。每次使用Eden和其中一个Survivor区域。每次回收时将Eden和Survivor中存活的对象一次复制到另一个没有使用的Survivor区域中。然后将Eden和原先使用的Survivor区域清理掉。Eden和Survivor区域的大小比例为8:1,每次使用90%(80%+10%),另外10%保留。当Survivor空间不够用时,会使用老年代分配担保。
三、标记-整理算法
因为复制算法的第一个缺点(例:老年代),出现了标记-整理算法。
标记-整理算法也分为两步:
1、标记需要回收的对象
2、将存活的对象向一端移动,然后清理掉边界以外的内存。
示意图
回收前
回收后
四、分代算法
当前商用虚拟机采用的算法
根据对象存活周期的不同将内存分成几块。一般分为新生代和老年代。可以根据不同的区域特点使用不同的回收算法。新生代每次有大量对象需要回收,存活的较少,因此采用复制算法。老年代存活对象多,每次回收的对象较少,采用标记-整理算法。