串行垃圾回收器(Serial 收集器)
单线程的垃圾回收器,在垃圾回收时,需要其它线程暂停,等待垃圾回收完毕。
开启串行垃圾回收器的参数:-XX:+UseSerialGC = serial + serialOld
-
serial是工作在新生代,采用的是复制算法;
-
serialOld是工作在老年代,采用的是标记整理算法。
缺点:STW时间较长
优点:简单又高效,没有线程交互的消耗,收集效率高。
吞吐量优先垃圾回收器
多线程的垃圾回收器,注重的是单位时间内垃圾回收的STW时间最短。需要多核CPU支持,是和在服务器中 使用。
开启吞吐量优先垃圾回收器的参数:-XX:+Use Parallel GC ~ -XX:+Use Parallel Old GC
(Parallel:并行的)在JDK8是默认开启了这两个开关。当你手动开启其中一个开关,另一个也会默认开启。
-
ParallelGC 是工作在新生代,采用的是复制算法;
-
ParallelOldGC 是工作在老年代,采用的是标记整理算法。
优点:单位STW时间较短
缺点:垃圾回收时,CPU占用率过高
响应时间优先垃圾回收器
多线程的的垃圾回收器,注重的是尽可能让单次垃圾回收中STW的时间最短,在垃圾回收时,不需要其它线程暂停,可以和其它用户线程并发(concurrent)执行是多个线程和垃圾回收线程抢占CPU。
开启响应时间优先垃圾回收器的参数:-XX: +UseConcMarkSweepGC~-XX: +UseParNewGC~ Serial0ld
-
CMS GC是工作在老年代的,使用标记清除算法的GC。
-
PN GC是工作在新生代的,使用复制算法的GC
优点:并发收集、低停顿
缺点:垃圾回收占用了一整个线程,整个程序的吞吐量降低。会产生内存碎片。
**CMS垃圾回收器的工作步骤:**暂停两次,标记三次
-
初始标记: 暂停所有的其他线程,并记录下直接与 root 相连的对象,速度很快 ;
-
并发标记: 同时开启 GC 和用户线程,跟踪记录发生引用更新的对象。
-
重新标记: 重新标记产生变化的那部分对象。
-
并发清除: 线程恢复运行,并发清理每个线程的垃圾。
G1(Garbage First)收集器
G1 (Garbage-First) 是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器. 同时注重吞吐量(Throughput) 和低延迟(Low latency) .
整体上是标记+整理算法,两个区域之间是使用复制算法
超大堆内存,会将堆划分为多个大小相等的区域Region(每个区都有自己新生代和老年代)
开启G1垃圾回收器的参数:- XX: +UseG1GC
在JDK9之前需要手动启用G1回收
-
初始标记:在Young GC时会进行GC Root的初始标记
-
并发标记:老年代占用堆空间比例达到阈值时,进行并发标记(不会STW),JVM参数决定
-XX:InitiatingHeapOccupancyPercent = percent
(默认45%) -
最终标记:对E、S、O区域进行全面垃圾回收,会STW
-
筛选回收:
具体的回收步骤:
将E区和S区的无用对象进行回收,有用对象进行复制算法到一个新的S区。
将符合晋升阈值的对象加入到老年代中。
当现有的O区中内存已满,就会根据暂停时间,在暂停时间内,有选择的将O区中的对象复制到新的O区中。(优先回收能释放出更多内存的区域,所以叫做Garbage First)