GC之Parallel Scavenge收集器

补充:堆内存是指JVM的内存大小包括堆区和非堆区;
-server 服务器模式运行,-client表示客户端运行模式;
-Xms2G 最小JVM内存2G,是JVM的堆区的大小,不包括PermGen;
-Xmx3G 最大JVM内存3G,是JVM的堆区的大小,不包括PermGen;
-Xmn1G 指定JVM堆区中新生代的初始化大小为1G;

What(是什么)

Parallel Scavenge收集器是Java虚拟机中垃圾收集器的一种。
又称为吞吐量优先收集器,和ParNew收集器类似,是一个新生代收集器。使用复制算法的并行多线程收集器。Parallel Scavenge是Java1.8默认的收集器,特点是并行的多线程回收,以吞吐量优先。

Why(为什么)

1.主要特点

Parallel Scavenge收集器的关注点与其他收集器不同, Parallel Scavenge收集器的目标则是达到一个可控制的吞吐量(Throughput)
(吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间))

2.使用场景

Parallel Scavenge收集器的高吞吐量可以最高效率的利用CPU时间,尽快的完成程序的运算任务等,主要适合在后台运算而不是太多交互的任务(其不适合需要与用户交互的程序,良好的响应速度能提升用户的体验,此种场景CMS效果更好)。

How(怎么做)

1. 重要参数

重要的参数有三个,其中两个参数用于精确控制吞吐量,分别是

  • 1.1. 控制最大垃圾收集停顿时间的-XX:MaxGCPauseMillis参数
    MaxGCPauseMillis参数允许的值是一个大于0的毫秒数,收集器将尽力保证内存回收花费的时间不超过设定值。不过大家不要异想天开地认为如果把这个参数的值设置得稍小一点就能使得系统的垃圾收集速度变得更快,GC停顿时间缩短是以牺牲吞吐量和新生代空间来换取的:系统把新生代调小一些,收集300MB新生代肯定比收集500MB快吧,这也直接导致垃圾收集发生得更频繁一些,原来10秒收集一次、每次停顿100毫秒,现在变成5秒收集一次、每次停顿70毫秒。停顿时间的确在下降,但吞吐量也降下来了。

  • 1.2. 直接设置吞吐量大小的 -XX:GCTimeRatio参数。
    GCTimeRatio参数的值应当是一个大于0小于100的整数,也就是垃圾收集时间占总时间的比率。如果把此参数设置为19,那允许的最大GC时间就占总时间的5%(即1 /(1+19)),默认值为99,就是允许最大1%(即1 /(1+99))的垃圾收集时间。

  • 1.3. UseAdaptiveSizePolicy开关参数。
    -XX:+UseAdaptiveSizePolicy是一个开关参数,当这个参数打开之后,就不需要手工指定新生代的大小(-Xmn)、Eden与Survivor区的比例(-XX:SurvivorRatio)、晋升老年代对象年龄(-XX:PretenureSizeThreshold)等细节参数了,虚拟机会根据当前系统的运行情况收集性能监控信息,动态调整这些参数以提供最合适的停顿时间或最大的吞吐量,这种调节方式称为GC自适应的调节策略(GC Ergonomics)。

  • 1.4. GC Ergonomics:表示GC的自适应调节策略,其中Ergonomics单词表示工效学,人体工程学的意思。

2. 自适应调节策略

Parallel Scavenge收集器能够配合自适应调节策略,把内存管理的调优任务交给虚拟机去完成。只需要把基本的内存数据设置好(如-Xmx设置最大堆),然后使用-XX:MaxGCPauseMillis参数(更关注最大停顿时间)或GCTimeRatio参数(更关注吞吐量)给虚拟机设立一个优化目标,那具体细节参数的调节工作就由虚拟机完成了。
自适应调节策略也是Parallel Scavenge收集器与ParNew收集器的一个重要区别。

-XX:-UseParallelGC 和 -XX:+UseParallelOldGC

Parallel New参考

使用方式:-XX:+UseParallelGC强制使用该收集器,打开该收集器后,将使用Parallel Scavenge(年轻代)+Serial Old(老年代)的组合进行GC。

Parallel Old参考:是Parallel Scavenge收集器的老年代版本,用于老年代的垃圾回收,但与Parallel Scavenge不同的是,它使用的是“标记-整理算法”。
适用于注重于吞吐量及CPU资源敏感的场合。

使用方式:-XX:+UseParallelOldGC,打开该收集器后,将使用Parallel Scavenge(年轻代)+Parallel Old(老年代)的组合进行GC。

补充

[GC[PSYoungGen 表示用的是年轻代使用Parallel Scavenge收集器。
[GC[ParNew 表示使用的是年轻代使用ParNew收集器(Parallel New收集器)。
[GC[DefNew 表示用的是年轻代使用Serial收集器(Serial New收集器)。
[GC[PSOldGen 表示用的是老年代使用的Parallel Old收集器。

JVM的GC日志的主要参数包括如下几个:

-XX:+PrintGC 输出GC日志
-XX:+PrintGCDetails 输出GC的详细日志
-XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式)
-XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)
-XX:+PrintHeapAtGC 在进行GC的前后打印出堆的信息
-XX:+PrintGCApplicationStoppedTime // 输出GC造成应用暂停的时间
-Xloggc:../logs/gc.log 日志文件的输出路径

你可能感兴趣的:(GC之Parallel Scavenge收集器)