标记清除算法
顾名思义:算法分为标记和清除两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收被标记的对象。
不足之处:
1. 效率问题:标记和清除的效率都不高
2. 空间问题:清除后有大量不连续的内存碎片,分配大内存时会进行另一次GC
复制算法
将内存分为大笑相等的两块,每次使用其中一块。当这一块用完了,将还存活的对象复制到另一块上面,然后将这一块清理掉。
代价是内存缩小一半,代价太大。
IBM研究表明:新生代的对象98%是朝生夕死,所以不需要按照1:1来分配内存。
实际情况中,将Eden和Survivor From、Survivor To 按 照8:1:1分配。每次只使用Eden和其中一块Survivor,GC时将Eden和Survivor From存活的对象复制到Survivor To上,之后From变成To
注:一些情况下,Eden和Survivor From存活的对象大于Survivor To的空间,这时候会将To区域的所有对象移入年老代
标记整理算法
较多的复制操作效率低。老年代的对象可能出现所有对象都存活的极端情况,所以老年代不能使用复制算法。
标记整理与标记清除算法的不同:标记整理会将存活的对象都向一端移动,然后直接清理掉边界以外的内存。
分代收集算法
对上述算法的利用。
- 新生代对象存活时间短,所以采用复制算法:只需要对少量对象进行复制即可完成搜集(90%的空间利用率)。
- 老年代对象存活时间长,存活率高,没必要使用额外空间分配担保,所以使用:标记-清理或标记-整理算法进行回收。