垃圾回收器的性能指标
主要是通过吞吐量,暂停时间和内存占用三大指标。
- 吞吐量:运行用户代码的时间占总运行时间的比例:吞吐量=用户代码运行时间/(用户代码运行时间+垃圾收集时间)
- 暂停时间:执行垃圾回收时,用户线程被暂停的时间
- 内存占用:Java堆区所占内存的大小
七款垃圾处理器
串行处理器:Serial,Serial Old
并行回收器:ParNew,Parallel Scavenge,Parallel Old
并发回收器:CMS,G1
新生代收集器:Serial,ParNew,Parallel Scavenge
老年代收集器:Serial Old,Parallel Old,CMS
整堆收集器:G1
Serial收集器
Serial是一种串行运行的,执行新生代收集的收集器。采用的是复制算法。
Serail Old收集器是串行运行的,运行老年代收集的收集器。采用的是标记-整理算法。
当Serial/Serial Old收集器运行时,其他用户线程必须要暂停,用户线程和GC线程无法并发运行。
ParNew回收器
ParNew是Serial收集器的多线程版本,采用并行回收的方式执行新生代的内存回收。
Parallel Old回收器
Parallel Old是基于并行回收的处理老年代垃圾的垃圾回收器,采用的是标记整理算法。
Parallel Scavenge回收器
Parallel Scavenge回收器采用的是并行回收,复制算法的机制,被称之为吞吐量优先的垃圾回收器。
高吞吐量可以高效率的利用CPU时间,尽快完成程序运算任务,主要适合在后台运算而不太需要交互的任务。
Java8中,默认是此收集器。
CMS回收器
是第一款真正意义上的并发收集器,第一次实现了让GC线程和用户线程同时工作。它采用的是标记清除算法,负责老年代的GC。
运行期间主要分为四个阶段:
- 初始标记阶段:所有工作线程暂停,标记出所有GC roots对象能直接关联到的对象,由于这类对象比较少,所以速度很快。
- 并发标记阶段:从Gc roots直接关联对象开始遍历整个对象图的过程,耗时较长但是不需要停顿用户线程,可以和GC线程并发运行。
- 重新标记阶段:暂停用户线程,修正并发标记阶段,因为用户线程继续运行导致标记产生变动的一部分对象的标记记录
- 并发清除阶段:GC线程与用户线程并发执行,清除掉所有被判定为死亡的对象。
CMS的优点和缺点
优点:1.并发收集 2. 低延迟
缺点:1.由于采用标记清除算法,所以会产生内存碎片 2.低吞吐量 3.无法处理并发标记阶段新产生的垃圾对象,无法及时回收这些垃圾对象
G1回收器
G1是一个并行回收器,将堆内存分割为很多区域Region,跟踪每一个Region里面堆积的垃圾的价值大小(根据回收所获得空间大小以及回收所需时间的经验值),在后台维护一个优先列表,根据所允许的收集时间,优先回收价值最大的Region。
G1优点
优点:1并发运行 2.分代收集