JVM垃圾回收算法解析
标记-清除算法
该算法为最基础的算法。它分为标记和清除两个阶段,首先标记出需要回收的对象,在标记结束后,统一回收。该算法存在两个问题:一是效率问题,标记和清除过程效率都不太高,二是空间问题,在执行一次清除操作后,会存在好多不连续的内存碎片,从而造成资源的浪费。空间碎片太多将会导致,当在程序运行过程中,需要分配较大对象的时候无法找到足够的连续内存将会导致下一次垃圾收集操作,如下图:
复制算法
该算法是在标记-清除算法的基础上出现的,它主要是为了提高效率,它将内存区域分为两个相等的块,每次只使用其中的一块,当一块用完了,就将还存活着的对象移动到另外一块上,然后将已存在的对象所占用的内存释放掉,这样只是把其中的一块内存释放掉,也不存在内存碎片的问题,但这种的算法的效率是建立在缩小内存为原来的50%的前提上,它是用空间换空间来获取的。
标记-整理算法
复制算法存在一个问题,当对象存活率较高时,它会频繁的进行复制操作,这样也会导致效率低下。标记-整理算法在前两个算法的基础上出现,它的标记过程和标记-清除算法过程是一样,只是它没有对可回收的对象进行回收,而是让所有存活的对象向一测移动,然后清除掉边界以外的内存。
分代收集算法
当前商业虚拟机的垃圾收集都采用分代收集算法,它是根据对象的生存周期将内存分为几部分,它一般分为新生代和老生代,在新生代,如果发现新生代中发现有大批对象死亡,少量对象存活,则采用复制算法,只需要牺牲少量的复制成本就可以完成本次垃圾收集,而老生代因为对象存活率,没有多余的空间为其做担保,一般会使用标记-清除算法或标记-整理算法进行处理。