虚拟机内的垃圾收集算法

时间:2018-08-21
本文章向大家介绍虚拟机内的垃圾收集算法,需要的朋友可以参考一下

我这只是介绍虚拟机内的垃圾收集算法大致介绍,因为每一种垃圾收集算法都涉及到大量的程序代码细节,而且各个平台的虚拟机操作内存的方法又各不一样,因此我这里就不对算法的实现做描述了;

1标记-清除算法

标记清除算法是最基础的算法,如名一样,分为 “标记 ”和 “清除”两个阶段,首先是标记哪些对象是需要清除的,哪些对象是需要清除的也就是不可能被任何途径使用的对象也称为“死对象”,标记完之后再统一回收被标记的所有对象,这种算法存在两个问题:一是效率问题,标记和清除两个过程的效率都不高,二是空间问题,被清除的对象会留下大量不连续的空间碎片,空间碎片太多可能会导致后续程序运行过程中需要分配较大内存的时候,找不到足够大连续的内存而触发再一次的垃圾收集动作;

2复制算法

标记清除算法效率不高,为了解决效率问题,复制算法出现了,它将可用内存分为大小相等的两块,虽然有两块但是它就只用一块,当这一块内存用完了,它再将还存活的对象的对象复制到另外一块上,然后再将用过的那一半内存空间一次情掉,这样每次都是对整个半区清理,内存分配的时候也就不用考虑空间碎片的问题;

3标记-整理算法

复制算法不知道大家有没有注意到,当一半内存存活数量很高的时候会做大量的复制操作,这样效率还是不够高,之后又有人提出另外的一种算法,标记整理算法,和标记清除算法一样,只是标记整理算法有后续的操作,就是对可回收对象进行整理,还存活的对象一边移,然后清理边界以外的内存

4分代收集算法

当前商业虚拟机的垃圾收集算法都采用的是分代收集算法,这种算法并没有什么心的思路,只是根据对象存活的周期不同将内存划分为几块,一般是把java堆分为新生代和老生代,这样就可以根据各个年代的特点对才用最适当的算法,在新生代中每次垃圾收集时都会有大量的对象死去只有少量存活就才用复制算法,而老年代中,因为对象存货率高,没有额外的空间对它们进行分配担保,就必须才用标记清理或者标记整理算法来进行回收;