垃圾收集算法第一种:标记-清除算法
第一步:标记出所有需要回收的对象(类比删除:记录所有删除的数据)
第二步:在标记完成后统一回收被标记的对象(类比删除:数组没有多余内存存储数据时,全部清除)
缺点:
1.标记和清除效率都很低(时间问题);
2.会产生很多不连续的内存碎片(空间问题),导致以后需要较大内存时,无法找到足够的连续空间而不得不提前触发垃圾收集动作
垃圾收集算法第二种:复制算法(解决时间问题)
第一步:将可用内存按照容量划分为相等的两块;
第二步:每次只使用其中的一块A;
第三步:当使用的一块内存A用完了,就将还存活的对象复制到另外一块内存B上面;
第四步:原来使用的内存空间A一次清理掉。
缺点:
1.内存缩小了一半
应用场景:
回收新生代(只浪费了百分之十的内存):
第一步:将内存划分为Eden空间和两块较小的Survivor空间,HotSpot虚拟机是8:1;
第二步:每次只使用Eden空间和一块Survivor空间(A);
第三步:当使用的内存用完时,把所有存活着的对象复制到另外一块Survivor空间(B);
第四步:原来使用的内存空间A一次全部清理掉。
在第三步中,如果B空间不够用,需要依赖其他的内存(这里指老年代)进行分配担保
缺点:
1.当对象存活率较高的时候就需要进行较多的复制操作,效率将会变低
2.还要有额外的空间作为担保
垃圾收集算法第三种:标记-整理算法
第一步:标记出所有需要回收的对象;
第二步:将所有的存活对象都向一端移动;
第三步:直接清理掉端边界以外的内存。
垃圾收集算法第四种:分代收集算法(对复制算法的优化)
第一步:将Java堆分为新生代和老生代(根据对象存活周期的不同);
第二步:新生代中采用复制算法(新生代中对象存活率较低);
第三步:老生代中采用标记-清除或者标记-整理算法(老生代中对象存活率比较高,没有额外的空间对她进行分配担保)