Java垃圾收集算法

当前Java垃圾回收主要有三种算法,然后根据不同情况,对三种算法进行结合,进行分代收集。

一. 标记-清除算法

1. 标记-清除(Mark-Sweep)分为两个阶段:首先标记出所有需要回收的对象,在标记完成之后统一回收被标记的对象。

2. 它是最基础的算法,后序的算法都是基于该算法改进的。

3. 有两个不足:第一,标记和清除效率都不高;第二,清除之后会产生大量不连续的内存碎片。

Java垃圾收集算法_第1张图片

二. 复制算法

1. 复制算法Copying,将内存分为大小相同的两块, 每次只使用其中一块,当这一块用完时,就将还存活的对象复制到另外一块上面,然后再把已使用过的内存一次清理掉。

2. 每次是使用一般的内存,效率不高,但不会有内存碎片。

3. 改进:因为新生代的对象98%都是朝生夕死,所以不需要按照1:1进行分配。将内存分为一块较大的Eden和两块较小的Survivor空间,每次使用Eden和一块Survivor空间,当回收时将Eden和Survivor中还存活着的对象一次性复制到另外一块Survivor空间上,最后清理掉Eden和刚才用过的Survivor空间。HotSpot默认Eden:Survivor=8:1。当Survivor空间不够用时,需要借助老年代进行分配担保。

Java垃圾收集算法_第2张图片

三. 标记-整理算法

1. 复制算法在对象存活率较高时效率会低下。

2. 根据老年代的特点,标记-整理(Mark-Compact)算法与标记清除的标记过程一样,但在清除阶段是让所有存活对象都移向一端,然后直接清理掉端边界以外的内存。

Java垃圾收集算法_第3张图片

四. 分代收集算法

1. 当前商业虚拟机的垃圾收集都采用分代收集算法,将Java堆分为新生代和老年代,根据每个代的不同,新生代因为每次垃圾收集都会有大量对象死去,所以采用复制算法。老年代存活率较高且没有额外空间进行分配担保,所以使用标记-清除或者标记-整理算法进行垃圾回收。

你可能感兴趣的:(Java垃圾收集算法)