垃圾回收算法:
1、标记—清除算法
分为标记、清除两个阶段,首先标记所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象。
缺点:一是效率问题,标记和清除过程的效率都不高;二是空间问题,标记清除后会产生大量不连续的内存碎片,可能会导致需要分配较大对象时无法找到足够的连续空间而触发下一次垃圾回收。
2、复制算法
将可用内存安装容量划分为大小相等的两块,每次只使用其中的一块,当这一块用完了,就将存活的对象复制到另一块内存上去,然后再把已使用的内存空间一次清理掉。
现代商业虚拟机都采用这种算法回收新生代。
3、标记整理算法
标记过程与“标记—清除”算法一样,接着将所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。
4、分代收集算法
当前商业虚拟机都采用的算法,只是根据对象的存活周期不同,将内存划分为几块,一般是划为新生代和老年代,然后根据各个年代的特点选用最适当的算法。
垃圾收集器:
1、Serial收集器
只会用一条收集线程完成收集,在进行垃圾收集时必须暂停其他所有的工作线程直到收集结束。
新生代采用复制算法,老年代采用标记—整理算法。
虚拟机运行在Client模式下的默认新生代收集器。
2、ParNew
ParNew其实就是Serial收集器的的多线程版本。
许多运行在Server模式下虚拟机中首选的新生代收集器。
3、Parallel Scavenge收集器
Parallel Scavenge收集器也是一个新生代收集器,也是使用复制算法,是并行的多线程收集器。
主要关注吞吐量。
4、Serial Old
Serial Old是Serial收集器的老年代版本,是一个单线程收集器,使用“标记—整理”算法。
5、Parallel Old收集器
Parallel Old是Parallel Scavenge收集器的老年代版本,使用多线程和“标记—整理”算法。这个收集器是JDK1.6才开始提供的。
6、CMS收集器
CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。使用“标记—清除”算法实现。运作过程分成四步:初始标记、并发标记、重新标记、并发清除。
7、G1收集器
G1收集器是当前收集器技术发展最前沿成果,在JDK1.6Update14中提供了Early Access版本的G1处理器以供试用。
G1收集器是基于“标记—整理”算法实现的收集器;它可以非常精确地控制停顿,既能让使用者明确地指定在一个长度为M毫秒的时间片段内,消耗在垃圾收集上的时间不得超过N毫秒,这几乎已经是实时Java垃圾收集器的特征了。