⑤. Parallel、ParallelOld:吞吐量优先
①. HotSpot的年轻代中除了拥有ParNew收集器是基于并行回收的以外, Parallel Scav enge收集器同样也采用了复制算法、并行回收和"Stop the World"机制。在Java8中,默认是此垃圾收集器
②. 那么Parallel收集器的出现是否多此一举?
和ParNew收集器不同,Parallel Scavenge收集器的目标则是达到一个可控制的吞吐量(Throughp ut),它也被称为吞吐量优先的垃圾收集器。
自适应调节策略也是Parallel Scavenge与ParNew一个重要区别
③. 高吞吐量则可以高效率地利用CPU时间,尽快完成程序的运算任务,主要适合在后台运算而不需要太多交互的任务。因此,常见在服务器环境中使用。例如,那些执行批量处理、订单处理、工资支付、科学计算的应用程序。
④. Parallel收集器在JDK1.6时提供了用于执行老年代垃圾收集的 Parallel 0ld收集器,用来代替老年代的Serial 0ld收集器
⑤. Parallel 0ld收集器采用了标记一压缩算法,但同样也是基于并行回收和”Stop一the一World"机制
⑥. 在程序吞吐量优先的应用场景中,Parallel 收集器和Parallel 0ld收集器的组合,在Server模式下的内存回收性能很不错
⑦. 参数配置
-XX:+UseParallelGC手动指定年轻代使用Parallel并行收集器执行内存回收任务
-XX:+UseParallelOldGC手动指定老年代都是使用并行回收收集器。
(分别适用于新生代和老年代。默认jdk8是开启的。上面两个参数,默认开启一个,另一个也会被开启。(互相激活))
-XX:ParallelGCThreads设置年轻代并行收集器的线程数。一般地,最好与CPU数量相等,以避免过多的线程数影响垃圾收集性能
(在默认情况下,当CPU 数量小于8个, ParallelGCThreads 的值等于CPU 数量。
当CPU数量大于8个,ParallelGCThreads 的值等于3+[5*CPU_Count]/8] )
-XX:MaxGCPauseMillis:设置垃圾收集器最大停顿时间(即STW的时间)。单位是毫秒
(为了尽可能地把停顿时间控制在MaxGCPauseMills以内,收集器在工作时会调整Java堆大小或者其他一些参数
对于用户来讲,停顿时间越短体验越好。但是在服务器端,我们注重高并发,整体的吞吐量。所以服务器端适合Parallel,进行控制
该参数使用需谨慎)
-XX:+UseAdaptiveSizePolicy 设置Parallel Scavenge收集器具有自适应调节策略
(在这种模式下,年轻代的大小、Eden和Survivor的比例、晋升老年代的对象年龄等参数会被自动调整,已达到在堆大小、吞吐量和停顿时间之间的平衡点
在手动调优比较困难的场合,可以直接使用这种自适应的方式,仅指定虚拟机的最大堆、目标的吞吐量(GCTimeRatio)和停顿时间(MaxGCPauseMills),让虚拟机自己完成调优工作)
⑧. 详解-XX:+PrintGCDetails
- ①. Minor GC
②. Full GC
③. 举例补充
/** * 在jdk7 和 jdk8中分别执行 * -verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8 -XX:+UseSerialGC */ public class GCLogTest1 { private static final int _1MB = 1024 * 1024; public static void testAllocation() { byte[] allocation1, allocation2, allocation3, allocation4; allocation1 = new byte[2 * _1MB]; allocation2 = new byte[2 * _1MB]; allocation3 = new byte[2 * _1MB]; allocation4 = new byte[4 * _1MB]; } public static void main(String[] agrs) { testAllocation(); } }
⑨. 其他垃圾回收器概述
- ①. Open JDK12的Shenandoah GC
- 暂时时间短、吞吐量下降
- red hot 团队
- ②. 革命性的ZGC(jdk11-oracle)
( 在尽可能对吞吐量影响不大的前提下.实现在任意堆内存大小都可以把垃圾收集的停顿时间控制在10毫秒之内)