随笔分类
Parallel Scavenge 回收器
吞吐量优先
Parallel和ParNew底层使用的框架是不同的,各成一派
HotSpot的年轻代中除了拥有ParNew收集器是基于并行回收的以外, Parallel Scavenge收集器同样也采用了复制算法、并行回收和"stop the World"机制。
那么Parallel收集器的出现是否多此一举?
- 和ParNew收集器不同,Parallel Scavenge收集器的目标则是为了达到一个可控制的吞吐量(Throughput),它也被称为吞吐量优先的垃圾收集器.
- 自适应调节策略也是Parallel Scavenge 与 ParNew的一个重要区别
-
Parallel 收集器在JDK1.6时提供了用于执行老年代垃圾收集的Parallel Old收集器,用来代替老年代的Serial old收集器。
-
Parallel old收集器采用了标记-压缩算法,但同样也是基于并行回收和"Stop-the-World"机制
在程序吞吐量优先的应用场景中,Parallel收集器和Parallel Old收集器的组合,在Server模式下的内存回收性能很不错
在Java 8 中,默认使用的便是Parallel 收集器
参数设置
-
-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堆大小或者其他一些参数
- 当其参数值设置得太小时,堆空间会变小以来保证在给定时间内能够进行GC,但是堆空间变小了,这也就意味着GC发生的频率高了,即系统的吞吐量便会下降
-
-XX∶GCTimeRatio 垃圾收集时间占总时间的比例(= 1 /(N + 1))。用于衡量吞吐量的大小。
- 取值范围(0,100)。默认值99,也就是垃圾回收时间不超过1
- 与前一个-XX∶MaxGCPauseMillis参数有一定矛盾性。暂停时间越长,Radio参数就容易超过设定的比例
-
-XX:+UseAdaptiveSizePolicy:设置Parallel Scavenge收集器具有自适应调节策略
- 在这种模式下,年轻代的大小、Eden和Survivor的比例、晋升老年代的对象年龄等参数会被自动调节,已来达到在堆大小、吞吐量和停顿时间之间的平衡点.
- 在手动调优比较困难的场合,可以直接使用这种自适应的方式,仅指定虚拟机的最大堆、目标的吞吐量(GCTimeRatio)和停顿时间(MaxGCPauseMills),让虚拟机自己来完成调优工作.
- 自适应调节策略默认情况下是打开着的