垃圾收集器分类
- 串行收集器 Serial:Serial,Serial Old;
- 并行收集器 Parallel:Parallel Scavenge,Parallel Old,吞吐量优先;
- 并发收集器 Concurent:CMS,G1,停顿时间优先;
并行(Parallel)
指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态;适合科学计算,后台处理等弱交互场景;
并发(Concurent)
指用户线程与垃圾收集线程同时执行(但不一定是并行的,可能会交替执行),垃圾收集线程在执行的时候不会停顿用户程序的运行;适合对响应时间有要求的场景,比如Web;
停顿时间
垃圾收集器做垃圾回收中断应用执行的时间,-XX:MaxGCPauseMills;
吞吐量
花在垃圾收集的时间和花在应用时间的占比,-XX:GCTimeRetio=<n>,垃圾收集时间占:1/1+n;
注:衡量一个垃圾收集器的好坏的时候,以吞吐量为最大,停顿时间最小为最好;
开启串行收集器 Serial
- -XX:+UseSerialGC 作用于新生代;
- -XX:+UseSerialOldGC 作用于老生代;
注:Web环境下不可能用到串行收集器;
开启并行收集器 Parallel
吞吐量优先;
- -XX:+UseParallelGC 作用于新生代;
- -XX:+UseParallelOldGC 作用于老生代;
查看进程是否开启了ParallelGC
PS C:\Users\LiXinlei> jinfo -flag UseParallelGC 11924
-XX:+UseParallelGC
PS C:\Users\LiXinlei> jinfo -flag UseParallelOldGC 11924
-XX:+UseParallelOldGC
注:Server模式下默认的收集器;
开启并发收集器 Concurent
响应时间/停顿时间优先;
CMS(Concurrent Mark Sweep)
- -XX:+UseConcMarkSweepGC 作用于Old区;
- -XX:+UseParNewGC 默认用Parallel New作用于Yong区;
G1(Garbage-First)
- -XX:+UseG1GC
查看进程是否开启了ConcMarkSweepGC
PS C:\Users\LiXinlei> jinfo -flag UseConcMarkSweepGC 8180
-XX:+UseConcMarkSweepGC
PS C:\Users\LiXinlei> jinfo -flag UseParNewGC 8180
-XX:+UseParNewGC
垃圾收集器搭配
- 有连线的是可以相互使用的;
- JDK8推荐使用G1,性能比较好,在Yong区和Old区都可以使用;
-
虚线表示CMS可能退化成SerialOld,空间担保分配失败;
如何选择垃圾收集器
- 优先调整堆的大小,让JVM自己来选择;
- 如果内存小于100M,使用串行收集器;
- 如果是单核,并没有停顿时间的要求,串行或JVM自己选;
- 如果允许停顿时间超过1秒,选择并行或JVM自己选;
- 如果响应时间非常重要,并且不能超过1秒,使用并发收集器;