Parallel Scavenge收集器是JAVA虚拟机中垃圾收集器的一种。和ParNew收集器类似,是一个新生代收集器。使用复制算法的并行多线程收集器。

1、特点

Parallel Scavenge收集器的关注点与其他收集器不同, ParallelScavenge收集器的目标则是达到一个可控制的吞吐量(Throughput)。所谓吞吐量就是CPU用于运行用户代码的时间与CPU总消耗时间的比值,即吞吐量 = 运行用户代码时间 /(运行用户代码时间 + 垃圾收集时间),虚拟机总共运行了100分钟,其中垃圾收集花掉1分钟,那吞吐量就是99%。

由于与吞吐量关系密切,Parallel Scavenge收集器也经常被称为“吞吐量优先”收集器。

该垃圾收集器,是JAVA虚拟机在Server模式下的默认值,使用Server模式后,java虚拟机使用Parallel Scavenge收集器(新生代)+ Serial Old收集器(老年代)的收集器组合进行内存回收。

2、使用场景

主要适应主要适合在后台运算而不需要太多交互的任务。

比如需要与用户交互的程序,良好的响应速度能提升用户的体验;而高吞吐量则可以最高效率地利用CPU时间,尽快地完成程序的运算任务等。

3、重要参数

重要的参数有三个,其中两个参数用于精确控制吞吐量,分别是控制最大垃圾收集停顿时间的-XX:MaxGCPauseMillis参数及直接设置吞吐量大小的 -XX:GCTimeRatio参数。另外一个是UseAdaptiveSizePolicy开关参数。

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

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

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

4、自适应调节策略

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

5、具体使用示例

源代码

package com.gc;

import java.util.ArrayList;

import java.util.List;

/**

* 简单的JAVA虚拟机内存回收,Parallel Scavenge收集器的使用

* 运行参数,见具体方法,注意:需要开启server模式才能使用

* @author 范芳铭

*/

public class EasyParallelScavenge {

public byte[] placeHolder =new byte[64 * 1024]; //占位符

public static voidmain(String[] args) throws Exception{

outOfMemoryByExpansionSize();

}

/**

* JAVA虚拟机的大小适当可扩展,其中Xms30m,Xmx400m

* 参数:-server -Xms30m-Xmx100m -XX:+UseParallelGC -XX:+PrintGCDetails

* @author 范芳铭

*/

private static voidoutOfMemoryByExpansionSize() throws Exception{

List<EasyParallelScavenge>list = new ArrayList<EasyParallelScavenge>();

while(true){

EasyParallelScavengeserial = new EasyParallelScavenge();

list.add(serial);

Thread.sleep(10);//停顿10毫秒

}

}

}

参数说明:

-server  服务器模式运行

-Xms30m  最小JAVA虚拟机内存30M

-Xmx100m最大JAVA虚拟机内存100M

-XX:+UseParallelGC   明确指定使用Parallel Scavenge收集器

-XX:+PrintGCDetails 打印回收情况

运行结果如下:

…[GC [PSYoungGen: 7449K->3728K(7552K)] 66980K->66980K(75136K),0.0022792 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]

[GC [PSYoungGen:7443K->3728K(7552K)] 70695K->70715K(75136K), 0.0027722 secs] [Times:user=0.00 sys=0.03, real=0.00 secs]

[Full GC [PSYoungGen:3728K->3136K(7552K)] [PSOldGen: 66986K->67563K(76928K)]70715K->70700K(84480K) [PSPermGen: 2088K->2088K(16384K)], 0.0038774 secs][Times: user=0.00 sys=0.00, real=0.00 secs]

[GC [PSYoungGen: 3714K->3744K(7552K)]71278K->71308K(84480K), 0.0017028 secs] [Times: user=0.00 sys=0.00,real=0.00 secs]

[GC [PSYoungGen:7459K->3744K(7552K)] 75023K->75025K(84480K), 0.0027427 secs] [Times:user=0.00 sys=0.00, real=0.00 secs]

[GC [PSYoungGen: 7459K->3744K(7552K)]78739K->78753K(84480K), 0.0048844 secs] [Times: user=0.03 sys=0.00,real=0.01 secs]

[Full GC [PSYoungGen:3744K->1728K(7552K)] [PSOldGen: 75009K->76922K(87488K)]78753K->78651K(95040K) [PSPermGen: 2088K->2088K(16384K)], 0.0107597 secs][Times: user=0.00 sys=0.00, real=0.01 secs]

[GC [PSYoungGen:3714K->3744K(7552K)] 80637K->80667K(95040K), 0.0015904 secs] [Times:user=0.00 sys=0.00, real=0.00 secs]

[GC [PSYoungGen:7459K->3728K(7552K)] 84382K->84372K(95040K), 0.0028244 secs] [Times:user=0.03 sys=0.00, real=0.00 secs]

[GC [PSYoungGen:7443K->3728K(7552K)] 88087K->88093K(95040K), 0.0023412 secs] [Times:user=0.00 sys=0.00, real=0.00 secs]

[Full GC [PSYoungGen:3728K->640K(7552K)] [PSOldGen: 84364K->87438K(91072K)]88093K->88078K(98624K) [PSPermGen: 2088K->2088K(16384K)], 0.0048474 secs][Times: user=0.00 sys=0.00, real=0.00 secs]

[Full GC [PSYoungGen:3714K->128K(7552K)] [PSOldGen: 87438K->91023K(91072K)]91153K->91151K(98624K) [PSPermGen: 2088K->2088K(16384K)], 0.0047349 secs][Times: user=0.00 sys=0.00, real=0.00 secs]

[Full GC [PSYoungGen:3714K->3714K(7552K)] [PSOldGen: 91023K->91023K(91072K)]94738K->94738K(98624K) [PSPermGen: 2088K->2088K(16384K)], 0.0031963 secs][Times: user=0.00 sys=0.00, real=0.00 secs]

[Full GC [PSYoungGen: 3714K->3649K(7552K)][PSOldGen: 91023K->91070K(91072K)] 94738K->94720K(98624K) [PSPermGen:2088K->2087K(16384K)], 0.0209529 secs] [Times: user=0.03 sys=0.00, real=0.02secs]

[Full GC [PSYoungGen:3713K->3713K(7552K)] [PSOldGen: 91070K->91070K(91072K)] 94784K->94784K(98624K)[PSPermGen: 2087K->2087K(16384K)], 0.0035128 secs] [Times: user=0.02sys=0.00, real=0.00 secs]

[Full GC [PSYoungGen:3713K->3713K(7552K)] [PSOldGen: 91070K->91070K(91072K)]94784K->94784K(98624K) [PSPermGen: 2087K->2087K(16384K)], 0.0027033 secs][Times: user=0.00 sys=0.00, real=0.00 secs]

Exception in thread "main"java.lang.OutOfMemoryError: Java heap space

atcom.gc.EasyParNew.<init>(EasyParNew.java:12)

atcom.gc.EasyParNew.outOfMemoryByExpansionSize(EasyParNew.java:39)

atcom.gc.EasyParNew.main(EasyParNew.java:14)

Heap

PSYoungGen     total 7552K, used 3776K [0x0e4b0000, 0x0efc0000, 0x0efc0000)

eden space 3776K, 100% used [0x0e4b0000,0x0e860000,0x0e860000)

from space 3776K, 0% used [0x0ec10000,0x0ec10000,0x0efc0000)

to   space 3776K, 0% used[0x0e860000,0x0e860000,0x0ec10000)

PSOldGen       total 91072K, used 91070K [0x08bc0000, 0x0e4b0000, 0x0e4b0000)

object space 91072K, 99% used[0x08bc0000,0x0e4af980,0x0e4b0000)

6、和serial、parNew两种新生代收集器的简单区别

[GC [DefNew: 1986K->128K(2112K),0.0011191 secs] 27809K->27808K(30528K), 0.0011425 secs] [Times: user=0.00sys=0.01, real=0.00 secs]

[GC [ParNew: 1990K->132K(2112K),0.0007742 secs] 24112K->24110K(30528K), 0.0007964 secs] [Times: user=0.00sys=0.00, real=0.00 secs]

[GC [PSYoungGen:7449K->3728K(7552K)] 66980K->66980K(75136K), 0.0022792 secs] [Times:user=0.00 sys=0.00, real=0.00 secs]

GC[ParNew 表示使用的是parNew收集器。

GC[DefNew 表示用的是serial收集器。

[GC[PSYoungGen 表示用的是Parallel Scavenge收集器。
---------------------
作者:阿饭同学
来源:CSDN
原文:https://blog.csdn.net/ffm83/article/details/42872661
版权声明:本文为博主原创文章,转载请附上博文链接!

JAVA垃圾收集器之Parallel Scavenge收集器相关推荐

  1. Jvm垃圾收集器总结之 Parallel Scavenge 收集器

    Parallel Scavenge 收集器是个新生代收集器.它也是使用复制算法的收集器,又是并行的多线程收集器....看上去和ParNew 都一样,那它有什么特别之处呢? Parallel Scave ...

  2. 【Android 内存优化】垃圾回收算法 ( 分代收集算法 | Serial 收集器 | ParNew 收集器 | Parallel Scavenge 收集器 | CMS 并发标记清除收集器 )

    文章目录 一. 分代收集算法 二. 垃圾回收器 / 收集器 ( GC ) 三. 串行收集器 ( Serial ) 四. ParNew 收集器 五. Parallel Scavenge 收集器 六. C ...

  3. Parallel Scavenge收集器:吞吐量优先

    Parallel Scavenge收集器,是年轻代中除了ParNew以外的另一款垃圾收集器,同样采用了并行回收.复制算法和"Stop The World"机制. 那么它和ParNe ...

  4. 27.垃圾收集器(Serial收集器、ParNew收集器、Parallel收集器、Parallel Old 收集器、CMS收集器、G1收集器、常用的收集器组合)

    27.垃圾收集器 27.1.Serial收集器 27.2.ParNew收集器 27.3.Parallel收集器 27.4.Parallel Old 收集器 27.5.CMS收集器 27.6.G1收集器 ...

  5. 深入理解Java虚拟机——Parallel Old收集器

    目录 一.Parallel Old收集器的概述 二.Parallel Old收集器运行示意图 一.Parallel Old收集器的概述 Parallel Old收集器是Parallel Scaveng ...

  6. Serial Old收集器和Parallel Old收集器

    Serial Old收集器 Serial Old是 Serial收集器的老年代版本: 1.特点 针对老年代: 采用"标记-整理"算法(还有压缩,Mark-Sweep-Compact ...

  7. 我的读书笔记——Paralled Scavenge 收集器

    我的读书笔记 Parallel Scavenge 收集器 ​ Paralled Scavenge 收集器是一个新生代收集器,他也是使用复制算法的收集器,又是使用并行的多线程收集器.这个收集器的特点是他 ...

  8. Parallel Old收集器

    Parallel Old收集器是Parallel Scavenge收集器的老年代版本,使用多线程和"标记-整理算法"进行垃圾回收. 吞吐量优先

  9. 【jvm我能讲两小时056】说说Parallel old收集器的特点以及使用场景?

    说说Parallel old收集器的特点以及使用场景? Parallel Old是Parallel Scavenge收集器的老年代版本, 支持多线程并发收集, 基于标记-整理算法实现 . 这个收集器 ...

  10. java io null异常,java.io.IOException:所有收集器的初始化失败。最后一个收集器中的错误是:null...

    我是MapReduce的新手,我试图找到问题的解决方案.我试图链接两个地图reduce作业.第一份工作正在执行,但在第二份工作上我是得到一个错误如下java.io.IOException:所有收集器的 ...

最新文章

  1. pytorch one-hot转数组
  2. 10次相遇我才知道什么是成熟的爱--转
  3. slf4j 和 log4j的关系及合用Maven配置
  4. 来吧学学.Net Core之项目文件简介及配置文件与IOC的使用
  5. 工作流实战_06_flowable 流程定义的删除
  6. 2.15_graph_图
  7. Android 对ScrollView滚动监听,实现美团、大众点评的购买悬浮效果
  8. jsp标签 meta的解释
  9. DOA算法1:MUSIC算法(一)
  10. 著作权登记信息采集表
  11. 用栈实现的算术表达式的运算
  12. 什么是钉钉项目施工和工程管理系统?
  13. 关于网狐游戏vs2003移植到vs2013
  14. WIN10远程控制(局域网+外网)
  15. Debian搭建PPTP
  16. 设置Mathtype的粗斜体
  17. python引用计数的原理_深入Python中引用计数
  18. 作为数字化转型的布道者,疫情后我们还需要坚守什么?
  19. 西门子PLC编程软件,最新版本是TIA STEP7 V16,功能更加强大
  20. 详解微信小程序页面间传递信息的三种方式

热门文章

  1. 有什么比较适合个人日常办公管理的便签软件
  2. 订单超时未支付自动关闭实现方案
  3. Matlab sym syms
  4. c语言指针存在哪,C语言指针你弄明白了吗
  5. 如何快速合并PDF文件?几个方法教你合并PDF
  6. NVivo 2018 Essential Training NVivo 2018基础教程 Lynda课程中文字幕
  7. 不断尝试,做更好的自己|Fabia,很高兴再认识你
  8. python哪个机构教的好_学Python去哪家机构比较好?老男孩教育怎么样?
  9. 当cmd里安装不了Appium-Python-Client时,Requirement already satisfied: Appium-Python-Client in
  10. Attention-guided Context Feature Pyramid Network for Object Detection