几种虚拟机垃圾收集算法的思想

my git : https://github.com/hejiawang

Java虚拟机学习

整理整理今天工作之余学习的成果——几种垃圾收集算法的思想

一、标记——清除算法

       标记——清除算法是最简单基础的垃圾收集算法,什么意思呢:就是标记、清除两步走,首先标记出所有需要回收的已经死了没人用的垃圾对象,在标记完成后,统一回收所有被标记的对象。

       这个算法的优点是相当简单,下面看看这个算法的不足:

       1、效率不高,标记和清除这两个步骤的效率都不高,

       2、空间问题。标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行过程中需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾收集操作。

       附上一张标记——清除算法的示例图,浅显易懂。。。。


几种虚拟机垃圾收集算法的思想
 二、复制算法

       之前说过,上面那个标记——清除算法效率不靠谱,然后复制算法诞生了。。。

       复制算法就是将可用内存按容量划分为大小相等的两块,每次只使用其中的一块,当这一块的内存用完了,就将还活着的对象复制到另外一块上面,然后再把已使用过得这块内存一次清理掉,成为没有对象的内存,这样反反复复。。。。。这就是复制算法的思想了。

       这个算法肯定是比标记——清除算法好了,解决标记——清除算法的不足,然后效率也还可以,就是付出的代价也有点太高了,将每次可用内存变成了总共内存的一半,不值啊也。。。

        一样,附上复制算法的解释说明图:


几种虚拟机垃圾收集算法的思想
 三、标记——整理算法

       为了节省点内存空间,又要解决标记——清除算法内存片段的问题,标记——整理算法从天而降。。。

       这种算法的思想就是优化了一下标记——清除算法,也是先对死了的对象进行标记,然后不是直接清除对象,而是让所有存活的对象都向一端活动,然后直接清除端边界以外的内存,示意图如下:

几种虚拟机垃圾收集算法的思想
 四、分代收集算法

       当前商业虚拟机的垃圾收集都采用这种分代收集算法,这个算法的思想就是根据java对象存活周期不同,将内存划分为几块。一般,把Java堆分为新生代和老年代,这样就可以根据各个年代的对象特点采用最适当的收集算法了,在新生代中,每次垃圾收集时都会有大批对象死去,只有少量存活,那就用复制算法,只需付出少量存活对象的复制成本就可以完成收集;而老年代中,因为对象存活率高、没有额外空间对他进行分配担保,就要使用“标记——清理”或者“标记——整理”算法来进行回收了。

       这个算法思想并没有什么新东西,这是将上面三种算法根据各自的特点,混合使用而已。

相关推荐