1. 标记-清理算法
第一阶段:标记
标记出需要收集的对象(通过对象可达性分析)
第二阶段:清理
缺点:
1. 效率不高
2. 清理之后,内存中存在大量的不连续的内存空间,导致给大对象分配内存空间时不足,导致触发另一次垃圾收集动作。
2. 复制算法(Eden+2Survivor,比例为8:1)
内存划分:1个较大的Eden区+2个较小的Survivor区。
内存使用:分配内存时,都是使用Eden区和其中一个Survivor区。
内存回收:将Eden区和其中一个Survivor区中还存活的对象一次性复制到另一块Survivor区,
然后清理掉Eden区和其中一个Survivor区的空间。
优点:相对于标记-清理算法,效率有所提高。
缺点:
1. 存活的对象往另一个Survivor区复制的时候,其对象大小可能大于Survivor区的空间大小。
这时候需要借助老年代进行内存担保(也就是直接进入老年代)。
2. 如果存留下来的对象比较多,就需要进行较多的复制,效率降低。
3. 标记-整理算法
相对于标记-清理算法,标记-整理算法在清理可回收对象后,对于还存活的对象,
向其中一端移动,以便腾出更多的内存空间供大对象使用。
4.分代收集算法
内存划分:新生代,老年代
新生代收集算法:
新生代内存中,每次垃圾收集,都会有大量的对象死去,只有少量存活,因此选择复制算法比较划算。
老年代收集算法:
老年代内存中,存活对象比较多,采用复制算法,效率变低,因此采用标记-清理或标记-整理算法。