JVM垃圾回收器-串行并行和吞吐量
串行Serial收集器
1.SerialGC
新生代:复制算法
使用方式:-XX:+UseSerialGC
特点:简单高效,清理非常干净,但CPU利用率高,停顿时间较长
使用场景:桌面应用程序或堆内存空间很小的项目
2.SerialGC
老年代:标记压缩(整理)算法
使用场景:主要用于Client模式,而在Server模式下有两大用途:
(A)、在JDK1.5及之前,与Parallel Scavenge收集器搭配使用(JDK1.6有Parallel Old收集器可搭配);
(B)、作为CMS收集器的后备预案,在并发收集发生Concurrent Mode Failure时使用;
并行收集器
多个gc线程同时清理堆内存垃圾,处理器要多核才能发挥功效。
1.ParNew收集器(Serial收集器的多线程版本)
特点:除了多线程,其余行为特点与Serial收集器一样,主要用于新生代垃圾收集器。
使用场景:在Server模式下,ParNew收集器是一个非常重要的收集器,因为除Serial外,目前只有它能与CMS收集器配合工作;但在单个CPU环境中,不会比Serail收集器有更好的效果,因为存在线程交互开销。
使用方式:-XX:+UseParNewGC
可通过-XX:ParallelGCThreads 限制线程数量(ParNew默认开启的收集线程与CPU的数量相同)
"-XX:+UseConcMarkSweepGC":指定使用CMS后,会默认使用ParNew作为新生代收集器;
2.吞吐量Parallel Scavenge优先收集器(PS收集器)
和parnew收集器一样,只是更注重了吞吐量。
特点:停顿时间短,回收效率高,对吞吐量要求高。
使用场景:高吞吐量为目标,减少垃圾收集时间,让用户代码获得更长运行时间,比如批量处理、订单处理、工资支付、科学计算的应用程序。
使用方式:-XX:UseAdaptiveSizePolicy:打开之后,就不需要设置细节【新生代大小(-Xmn),Edian,survivor比例及(-XX:SurvivorRatio)晋升老年代年龄(-XX:PretenureSizeThreshold)等】虚拟机根据系统运行状况,调整停顿时间,吞吐量, GC自适应调节策略,区别parnew。
-XX:GCTimeRatio 吞吐量大小 (0,100)设置垃圾回收时间占总时间的比例, 默认最大99(即1%时间用于垃圾收集)。
-XX:MaxGCPauseMillis 垃圾回收器最大停顿时间,数值越小则停顿时间少,发生频繁,也可能导致吞吐量的下降。
3.Parallel Old收集器
老年代:标记整理算法
使用场景:JDK1.6及之后用来代替老年代的Serial Old收集器;特别是在Server模式,多CPU的情况下;
使用方式:-XX:+UseParallelOldGC
吞吐量与收集器关注点说明
(A)、吞吐量(Throughput)
CPU用于运行用户代码的时间与CPU总消耗时间的比值;
即吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间);
高吞吐量即减少垃圾收集时间,让用户代码获得更长的运行时间;
(B)、垃圾收集器期望的目标(关注点)
- 停顿时间
停顿时间越短就适合需要与用户交互的程序;
良好的响应速度能提升用户体验;- 吞吐量
高吞吐量则可以高效率地利用CPU时间,尽快完成运算的任务;
主要适合在后台计算而不需要太多交互的任务;- 覆盖区(Footprint)
在达到前面两个目标的情况下,尽量减少堆的内存空间;
可以获得更好的空间局部性;