vlambda博客
学习文章列表

38、垃圾回收器 — Parallel Scavenge(JDK8默认)

01

Parallel Scavenge收集器:吞吐量优先

  1. Parallel Scavenge收集器采用了复制算法、并行回收和STW机制。

  2. Parallel 和 ParNew的区别:

    • Parallel Scavenge收集器的目标是达到一个可控制的吞吐量(Throughput),它被称为吞吐量优先的垃圾收集器

    • 自适应调节策略也是 Parallel Scavenge 收集器和 ParNew的一个区别。

  3. 高吞吐量可以高效率利用CPU时间,尽快完成程序的运算任务,主要适用于后台运算而不需要太多交互的任务。如执行批量处理、订单处理、工资支付、科学计算等应用程序。

  4. Parallel 收集器收集新生代,Parallel Old收集老年代

  5. Parallel Old采用 标记 - 压缩算法,基于并行回收和STW机制 

  6. 在程序吞吐量优先的应用场景中,Parallel 收集器和 Parallel Old 收集器的组合,在Server模式下的内存回收性能很不错。在JAVA 8 中,默认是这个垃圾回收器。


02

Parallel Scavenge收集器:参数配置

  1. -XX:+UseParallelGC:手动指定年轻代使用 Parallel 并行收集器执行内存回收任务。在使用了此配置之后,老年代会使用Parallel Old回收器。Parallel 和 Parallel Old互相激活。JDK8默认开启

  2. -XX:+UseParallelOldGC:手动指定老年代使用 Parallel Old 并行收集器执行内存回收任务。在使用了此配置之后,年轻代会使用 Parallel 回收器。Parallel 和 Parallel Old互相激活。JDK8默认开启

  3. -XX:ParallelGCThreads:设置年轻代并行收集器的线程数。一般最好与CPU数量相等,以免过多线程影响垃圾收集性能

    • 在默认情况下,当CPU数量小于或等于8个,ParallelGCThreads 的值就等于CPU的数量

    • 当CPU数量大于8个,ParallelGCThreads 的值等于 3+(5*CPU_count)/8 

  4. -XX:MaxGCPauseMillis:设置垃圾收集器最大停顿时间(即STW时间),单位是毫秒

    • 为了尽可能把停顿时间控制在MaxGCPauseMillis以内,收集器在工作时会调整Java堆大小或一些其他参数

    • 对于用户来讲,停顿时间越短体验越好。但是在服务器端,注重高并发,整体的吞吐量。所以服务器端适合使用Parallel进行控制

    • 该参数使用需要谨慎。

  5. -XX:GCTimeRatio:垃圾收集时间占总时间的比例(=1 / (N+1))。用于衡量吞吐量的大小

    • 取值范围(0,100)。默认值99,也就是垃圾回收时间不超过 1%

    • 与 -XX:MaxGCPauseMillis 参数有一定的矛盾性。暂停时间越长,Ratio 参数就越容易超过设定的比例

  6. -XX:+UseAdaptiveSizePolicy:设置 Parallel Scavenge 收集器具有自适应调节策略

    • 在这种模式下,年轻代的大小、Eden和Survivor的比例、晋升老年代的对象年龄等参数都会被自动调整,以达到在堆大小、吞吐量和停顿时间之间的平衡点

    • 在手动调优比较困难时,可以直接使用这种自适应方式,仅指定虚拟机的最大堆、目标吞吐量(GCTimeRatio)和停顿时间(MaxGCPauseMills),让虚拟机自己完成调优工作



扫码关注我




你们点点“分享”,给我充点儿电吧~