【004】【JVM——垃圾收集算法】



Java虚拟机学习总结文件夹


垃圾收集算法

垃圾收集算法的实现涉及大量的程序细节,并且各个平台的虚拟机操作内存的方法又各不同样,介绍几种垃圾收集算法的思想及其发展过程.

标记-清除算法

垃圾收集分为标记清除两个阶段:首先标记全部须要回收的对象。在标记完毕后统一回收全部被标记的对象。说它是最基础的收集算法。其它收集算法都是基于这样的思路并对其不足进行改进而得到的.它的主要不足有两个:

效率问题,标记和消除两个过程的效率都不高:

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

算法运行步骤例如以下图所看到的

复制算法

将可用内存按容量划分为大小相等的两块,每次仅仅使用当中的一块。

当这一块的内存用完了,就将还存活着的对象拷贝到另外一块上面,然后再把已使用过的内存空间一次清理掉。实现简单,执行高效。

算法运行步骤例如以下图所看到的

标记-整理算法

首先标记全部须要回收的对象,然后让全部存活的对象都向一端移动,然后直接清理掉端边界以外的内存。

算法运行步骤例如以下图所看到的

分代收集算法

商业虚拟机的垃圾收集都採用分代收集 Generational Collection )算法。依据对象存活周期的不同将内存划分为几块。通常是把Java堆分为新生代初老年代,这样就能够依据各个年代的特点採用最适当的收集算法。在新生代中,每次垃圾收集时都发现有大批对象死去,仅仅有少量存活,选用复制算法。仅仅须要付出少量存活对象的复制成本就能够完毕收集。而老年代中由于对象存活率高、没有额外空间对它进行分配担保。就必须使用标记一清理或者标记一整理算法来进行回收。

算法运行步骤例如以下图所看到的





【參见】【深入理解Java虚拟机(第二版)】【周志明】

【首发】【http://my.oschina.net/shiinnny/blog/388391】

原文地址:https://www.cnblogs.com/zsychanpin/p/6709092.html