1. 标记—清除(Mark-Sweep)算法
1.1 定义
最基础的算法,包括标记和清除两部分。
首先把需要回收的对象进行标记,标记完成后进行回收。
1.2 缺点
a.标记和清除的效率都很低;
b.该算法收集后产生大量不连续的内存碎片,导致分配大对象没有完整的足够大的内存而触发GC;
2. 复制算法
2.1 定义
将内存分为大小相等的A,B两块,先在A内存上分配对象,当A内存不够使用时将所有存活的对象复制到B内存(复制后的对象内存是连续的),然后清除A内存。
2.2 缺点
内存只有原来的一半;
2.3 优化
因为在堆中,新生代的对象大多时朝生夕死,而老年代对象存活率较高。
因此在新生代中 Eden : From Survivor :To Survivor = 8:1:1 大大提高了内存的使用率。
新创建的对象都会被分配到Eden区(一些大对象特殊处理),这些对象经过第一次Minor GC后,如果仍然存活,将会被移到Survivor区。对象在Survivor区中每熬过一次Minor GC,年龄就会增加1岁,当它的年龄增加到一定程度时,就会被移动到年老代中。
3. 标记—整理(Mark Compact)算法
3.1 定义
先对对象进行标记,然后让所有存活的对象向一端移动,最后清除端边界以外的内存。
适用于存活率较高的老年代。
4. 分代收集
现在商业虚拟机根据堆中新生代和老年代的不同特点,使用不同收集算法进行收集,进而提高收集效率