38、垃圾回收器 — Parallel Scavenge(JDK8默认)
01
Parallel Scavenge收集器:吞吐量优先
Parallel Scavenge收集器采用了复制算法、并行回收和STW机制。
Parallel 和 ParNew的区别:
Parallel Scavenge收集器的目标是达到一个可控制的吞吐量(Throughput),它被称为吞吐量优先的垃圾收集器
自适应调节策略也是 Parallel Scavenge 收集器和 ParNew的一个区别。
高吞吐量可以高效率利用CPU时间,尽快完成程序的运算任务,主要适用于后台运算而不需要太多交互的任务。如执行批量处理、订单处理、工资支付、科学计算等应用程序。
Parallel 收集器收集新生代,Parallel Old收集老年代
Parallel Old采用 标记 - 压缩算法,基于并行回收和STW机制
在程序吞吐量优先的应用场景中,Parallel 收集器和 Parallel Old 收集器的组合,在Server模式下的内存回收性能很不错。在JAVA 8 中,默认是这个垃圾回收器。
02
Parallel Scavenge收集器:参数配置
-XX:+UseParallelGC:手动指定年轻代使用 Parallel 并行收集器执行内存回收任务。在使用了此配置之后,老年代会使用Parallel Old回收器。Parallel 和 Parallel Old互相激活。JDK8默认开启
-XX:+UseParallelOldGC:手动指定老年代使用 Parallel Old 并行收集器执行内存回收任务。在使用了此配置之后,年轻代会使用 Parallel 回收器。Parallel 和 Parallel Old互相激活。JDK8默认开启
-XX:ParallelGCThreads:设置年轻代并行收集器的线程数。一般最好与CPU数量相等,以免过多线程影响垃圾收集性能
在默认情况下,当CPU数量小于或等于8个,ParallelGCThreads 的值就等于CPU的数量
当CPU数量大于8个,ParallelGCThreads 的值等于 3+(5*CPU_count)/8
-XX:MaxGCPauseMillis:设置垃圾收集器最大停顿时间(即STW时间),单位是毫秒
为了尽可能把停顿时间控制在MaxGCPauseMillis以内,收集器在工作时会调整Java堆大小或一些其他参数
对于用户来讲,停顿时间越短体验越好。但是在服务器端,注重高并发,整体的吞吐量。所以服务器端适合使用Parallel进行控制
该参数使用需要谨慎。
-XX:GCTimeRatio:垃圾收集时间占总时间的比例(=1 / (N+1))。用于衡量吞吐量的大小
取值范围(0,100)。默认值99,也就是垃圾回收时间不超过 1%
与 -XX:MaxGCPauseMillis 参数有一定的矛盾性。暂停时间越长,Ratio 参数就越容易超过设定的比例
-XX:+UseAdaptiveSizePolicy:设置 Parallel Scavenge 收集器具有自适应调节策略
在这种模式下,年轻代的大小、Eden和Survivor的比例、晋升老年代的对象年龄等参数都会被自动调整,以达到在堆大小、吞吐量和停顿时间之间的平衡点
在手动调优比较困难时,可以直接使用这种自适应方式,仅指定虚拟机的最大堆、目标吞吐量(GCTimeRatio)和停顿时间(MaxGCPauseMills),让虚拟机自己完成调优工作
扫码关注我
你们点点“分享”,给我充点儿电吧~