jvm-垃圾收集算法

理论上的垃圾收集算法:

标记-清除算法

​ 标记-清除(Mark-Sweep)算法是最普通的算法。如同的它的名字一样,分为“标记”和“清除”两个阶段:受限标记所有需要回收的对象,在标记完成后统一回收被标记的对象。它的主要不足有两个:一个是效率问题,标记和清除两个过程的效率都不高;另一个是空间的问题,标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后再程序运行过程中需要分配较大对象时,无法找到足够的连续内存而不得不提前出发另一次垃圾手机动作。

标记-清除

复制算法

​ 复制算法主要是为了解决标记-清除算法出现的效率问题,现在的商业虚拟机都是采用复制算法来回收新生代。它将可用内存容量划分为大小相同的两块,每次只使用其中的一块。当这一块的内存使用完了,就将还存活着的对象复制到另外一块上,然后再把已使用过的内存空间一次清理掉。这样每次都是对整个半区回收,也就不用考虑内存碎片等复杂情况。只是代价未免有点太高:内存缩小为原来的一半。

标记-清除

标记-整理算法

​ 复制算法在存活率较高时就要进行较多的复制,效率将会变低。标记-整理算法则是在标记之后不直接对可回收对象进行清理,二是让存活对象都移动到一端,然后直接清理边界以外的内存。

分代收集算法

​ 分代收集算法是根据对象存活的周期不同将内存划分为几块。一般是把堆划分为新生代和老年代,这样就可以根据各个年代的特点来采用最适当的收集算法。新生代中,由于每次垃圾回收都被发现有大批对象死去,只有少年存活,那就选用复制算法,只需要付出少年存活对象的复制成本就可以完成收集。而老年代中存活率高,没有二外的空间进行担保,就必须使用“标记-清除”或者“标记-整理”算法来进行回收。

坚持原创技术分享,您的支持将鼓励我继续创作!

热评文章