JVM-透彻掌握Parallel垃圾回收器的使用方法

本文介绍了JavaHotSpot中ParallelScavenge收集器,其特点是吞吐量优先,用于后台运算且目标是在限定时间内保持高执行效率。它与ParNew的区别在于适应用户设定的最大停顿时间,尤其适用于服务器环境。文章还讨论了相关参数如ParallelGCThreads、MaxGCPauseMillis和GCTimeRatio,以及在JDK1.6中的应用和自动适应策略。
摘要由CSDN通过智能技术生成

Parallel概述 HotSpot的年轻代中除了拥有ParNew收集器是基于并⾏回收的以外,Parallel Scavenge收集器同样也采⽤了复制 算法、并⾏回收和"Stop the World"机制。

那么Parallel 收集器的出现是否多此⼀举?

和ParNew收集器不同,Parallel Scavenge收集器的⽬标则是达到⼀个可控制的吞吐量,它也被称为吞吐量优先的 垃圾收集器。简单来说就是:

不管执⾏多少次,也不管每次执⾏多少时间,但是要在⼀定的时间范围⾥ ,尽可能让线程执⾏⽤户程序 ⾼吞吐量则可以⾼效率地利⽤CPU时间,尽快完成程序的运算任务,主要适合在后台运算⽽不需要太多交互的任 务。因此,常⻅在服务器环境中使⽤。例如,那些执⾏批量处理、订单处理、⼯资⽀付、科学计算的应⽤程序。

Parallel的第⼆个优势是⾃适应调节策略,也是Parallel Scavenge与ParNew⼀个重要区别,基本含义就是⽤户可以 设定垃圾回收的最⼤停顿时间。这⼀点在G1⾥得到充分发扬,性能和效果也更好。

Parallel收集器在JDK1.6时提供了⽤于执⾏⽼年代垃圾收集的Parallel old收集器,⽤来代替⽼年代的serial old收集器。

Parallel old收集器采⽤了标记-压缩算法,但同样也是基于并⾏回收和"stop-the-World"机制。

在程序吞吐量优先的应⽤场景中,Parallel收集器和Parallel old收集器的组合,在server模式下的内存回收性能很 不错。在Java8中,默认是此垃圾收集器 => 【Parallel Scavenge / Parallel old】

代码:

public class ParallGC {
 private static int size = 1024 * 256;
 public static void main(String[] args) {
 for (int i = 0; i < 33; i++) {
 byte[] allo = new byte[size];
 }
 }
}

JVM参数:

-Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:SurvivorRatio=8

⽇志:

0.093: [GC (Allocation Failure) [PSYoungGen: 8103K->528K(9216K)] 8103K->536K(19456K),
0.0008041 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
Heap
 PSYoungGen total 9216K, used 2900K [0x00000007bf600000, 0x00000007c0000000,
0x00000007c0000000)
 eden space 8192K, 28% used [0x00000007bf600000,0x00000007bf851260,0x00000007bfe00000)
 from space 1024K, 51% used [0x00000007bfe00000,0x00000007bfe84010,0x00000007bff00000)
 to space 1024K, 0% used [0x00000007bff00000,0x00000007bff00000,0x00000007c0000000)
 ParOldGen total 10240K, used 8K [0x00000007bec00000, 0x00000007bf600000,
0x00000007bf600000)
 object space 10240K, 0% used
[0x00000007bec00000,0x00000007bec02000,0x00000007bf600000)
 Metaspace used 3040K, capacity 4496K, committed 4864K, reserved 1056768K
 class space used 332K, capacity 388K, committed 512K, reserved 1048576K

常⻅参数配置

-XX:+UseParallelGC ⼿动指定年轻代使⽤Parallel并⾏收集器执⾏内存回收任务,默认jdk8是开启的。

-XX:+UseParalleloldGC ⼿动指定⽼年代使⽤并⾏回收收集器。默认jdk8是开启的。与-XX:+UseParallelGC互相激活,只要开启⼀个,另 外⼀个就⾃动开启。

-XX:ParallelGCThreads 设置年轻代并⾏收集器的线程数。⼀般地,最好与CPU数量相等,以避免过多的线程数影响垃圾收集性能。 在默认情况下,当CPU数量⼩于8个,ParallelGCThreads的值等于CPU数量。当CPU数量⼤于8个, ParallelGCThreads的值等于3 + [ 5 * CPU数量] / 8 ]。

-XX:MaxGCPauseMillis 设置垃圾收集器最⼤停顿时间(即STW的时间),单位是毫秒。 为了尽可能地把停顿时间控制在MaxGCPauseMills以内,收集器在⼯作时会调整Java堆⼤⼩或者其他⼀些参数。 对于⽤户来讲,停顿时间越短体验越好。但是在服务器端,我们注重⾼并发,整体的吞吐量。所以服务器端适合 Parallel,进⾏控制。该参数使⽤需谨慎。

-XX:GCTimeRatio,指定垃圾收集时间占总时间的⽐例(=1 /(N + 1)),⽤于衡量吞吐量的⼤⼩。取值范围 (0,100)。默认值99,也就是垃圾回收时间不超过1。与前⼀个-XX:MaxGCPauseMillis参数有⼀定⽭盾性。暂停 时间越⻓,Radio参数就容易超过设定的⽐例。

-XX:+UseAdaptiveSizePolicy 设置Parallel scavenge收集器是否开启⾃适应调节策略。在这种模式下,年轻代的⼤ ⼩、Eden和Survivor的⽐例、晋升⽼年代的对象年龄等参数会被⾃动调整,已达到在堆⼤⼩、吞吐量和停顿时间之 间的平衡点。

在⼿动调优⽐较困难的场合,可以直接使⽤这种⾃适应的⽅式,仅指定虚拟机的最⼤堆、⽬标的吞吐量 (GCTimeRatio)和停顿时间(MaxGCPauseMills),让虚拟机⾃⼰完成调优⼯作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值