面试小结
1、标记-清除算法
标记-清除算法 是一种常见的基础垃圾收集算法,它将垃圾收集分为两个阶段
标记阶段:标记出可以回收的对象
清除阶段:回收被标记的对象所占用的空间
缺点:
1、标记和清除的效率都不算高
2、容易产生大量不连续的内存碎片,碎片太多可能会导致后续没有足够的连续内存分配给较大的对象,从而提前触发新的一次垃圾收集动作
2、复制算法
把内存空间化为两个相等的区域,每次只使用其中一个区域。在垃圾收集时,遍历当前使用的区域,把存活对象复制到另外一个区域中,最后将当前使用的区域的可回收的对象进行回收。
代价:内存为原来的一半
复算法的效率与存活对象的数目多少有很大的关系,如果存活对象很少,复制算法的效率就会很高,适用于生命周期很短的对象
复制算法常用于新生代中
3、标记-压缩算法
标记可回收的对象后将所有存活对象压缩到内存的一端,使他们紧凑地排列在一起,然后对边界以外的内存进行回收,回收后,已用和未用的内存都各自一边。
老年代对象存活率会较高,如果用复制算法,这样会有较多的复制操作,导致效率降低
标记-压缩算法常用于老年代
4、分代收集器算法
分代收集算法会结合不同的收集算法来处理不同的空间
根据生命周期的长短将它们分别放到不同的区域,并在不同的区域采用不同的收集算法,这就是分代的概念
java堆区分类
新生代
Eden 空间
From Survivor空间
To Survivor 空间
由于Eden空间中大都数对象生命周期很短,所以新生代的空间划分并不均分,HotSpot虚拟机默认Eden 空间和两个Survivor 空间的所占的比例为8 : 1
老年代
有两种情况Eden 空间 和 From Survivor 空间存活的对象不会复制到 To Survivor 空间,而是晋级到老年代
1、存活对象的分代年龄超过所制定的阉值
2、另一种是To Survivor 空间容量达到阉值