垃圾收集器多种垃圾收集器,包括:串行垃圾收集器、并行垃圾收集器、CMS(并发)垃圾收集器、G1垃圾收集器
串行垃圾收集器serial
使用算法:年轻代使用 复制算法 , 老年代使用标记整理算法
- 特点:
- 单线程进行垃圾回收,垃圾回收时,只有一个线程在工作 停顿延迟高
- 缺点
- 停顿延迟高:执行回收时所有的Java线程都停止工作
- 参数设定
- -XX:+UseSerialGC 年轻代和老年代都使用串行垃圾收集器
- -XX:+PrintGCDetails 打印垃圾回收的详细信息
并行垃圾收集器 parnew
工作机制同serial相同,区别在于是多线程,效率提高
- 特点
- 多线程执行垃圾回收
- 缺点
- 执行垃圾回收时所有的Java线程都停止工作
- 参数设定
- XX:+UseParNewGC参数设置年轻代使用ParNew回收器
ParallelGC垃圾收集器
ParallelGC收集器工作机制和ParNewGC收集器一样,只是在此基础之上,新增了两个和系统吞吐量相关的参数,使得其使用起来更加的灵活和高效。
- 相关参数如
- -XX:+UseParallelGC 年轻代使用ParallelGC垃圾回收器,老年代使用串行回收器。
- -XX:+UseParallelOldGC 年轻代使用ParallelGC垃圾回收器,老年代使用ParallelOldGC垃圾回收器。
- 老年代使用ParallelOldGC使用标记整理算法,是并行的
- -XX:MaxGCPauseMillis 设置最大的垃圾收集时的停顿时间,单位为毫秒 慎用:ParallelGC为了达到设置的停顿时间,可能会调整堆大小或其他的参数,如果堆的大小设置的较小,就会导致GC工作变得很频繁
- -XX:GCTimeRatio 垃圾回收时间占程序运行时间的百分比,公式为1/(1+n)。 默认值为99,也就是垃圾回收时间不能超过1%
- -XX:UseAdaptiveSizePolicy 自适应GC模式,垃圾回收器将自动调整年轻代、老年代等参数,达到吞吐量、堆大小、停顿时间之间的平衡。
CMS并发收集器
- 使用标记-清除算法的垃圾回收器,是针对老年代垃圾回收的,通过参数-XX:+UseConcMarkSweepGC进行设置
- 缺点
- 对cpu资源敏感
- 无法处理浮动垃圾,可能执行失败呆滞Full GC
- 浮动垃圾指当次无法清楚的垃圾,留到下一次清除
- 标记-清除算法会产生磁盘碎片,可以 设置+UseCMSCompactAtFullCollection开启(默认开启),当要进行full GC 时 先进行磁盘碎片整理,整理过程单线程,会导致停顿
- 执行过程
- 初始化标记(CMS-initial-mark) ,标记root,会导致停顿
- 并发标记(CMS-concurrent-mark),与用户线程同时运行;
- 预清理(CMS-concurrent-preclean),与用户线程同时运行;
- 重新标记(CMS-remark) ,会导致停顿;
- 并发清除(CMS-concurrent-sweep),与用户线程同时运行;
G1垃圾收集器(重点)
jdk1.7中正式使用的全新的垃圾收集器
- 特点:
- 并发与并行:充分利用多核资源缩短停顿时间,执行回收和java程序并行
- 分代收集:同其他收集器相同,只是不用借助其他收集器
- 空间整合:整体采用标记-整理算法,局部采用复制算法 都不会产生磁盘碎片
- 可预测停顿:G1和CMS都是最求减低给停顿时间,但G1可以预测停顿时间,实现指名在一个M毫秒长时间片段内,停顿时间不能超过N毫秒
- 流程
- 初始标记 单线程
- 并发标记 多线程
- 最终标记 多线程
- 垃圾回收 多线程
怎么读GC日志
参数 -XX:+PrintGCDetails 打印垃圾回收的详细信息
打印日志信息
年轻代的内存GC前后的大小:
DefNew 执行垃圾回收采用的收集器
4416K->512K(4928K) 年轻代GC前,占有4416K内存,GC后,占有512K内存,总大小4928K
0.0046102 secs C所用的时间,单位为毫秒。
4416K->1973K(15872K) 表示,GC前,堆内存占有4416K,GC后,占有1973K,总大小为15872k
[GC (Allocation Failure) [DefNew: 4416K->512K(4928K), 0.0046102 secs] 4416K->1973K(15872K), 0.0046533 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
Full GC 表示是内存空间全部进行GC
[Full GC (Allocation Failure) [Tenured: 10944K->3107K(10944K), 0.0085637 secs] 15871K->3107K(15872K), [Metaspace: 3496K->3496K(1056768K)], 0.0085974 secs] [Times: user=0.02 sys=0.00, real=0.01 secs]
jstat -gc 6219 查看进程6219 回收统计次数等信息
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
9216.0 8704.0 0.0 6127.3 62976.0 3560.4 33792.0 20434.9 23808.0 23196.1 2560.0 2361.6 7 1.078 1 0.244 1.323
S0C:第一个Survivor区的大小(KB)
S1C:第二个Survivor区的大小(KB)
S0U:第一个Survivor区的使用大小(KB)
S1U:第二个Survivor区的使用大小(KB)
EC:Eden区的大小(KB)
EU:Eden区的使用大小(KB)
OC:Old区大小(KB)
OU:Old使用大小(KB)
MC:方法区大小(KB)
MU:方法区使用大小(KB)
CCSC:压缩类空间大小(KB)
CCSU:压缩类空间使用大小(KB)
YGC:年轻代垃圾回收次数
YGCT:年轻代垃圾回收消耗时间
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间