DefNewGeneration是default new generation
ParNewGeneration是parallel new generation

原本HotSpot VM里没有并行GC,当时就只有NewGeneration;后来准备要加入young gen的并行GC,就把原本的NewGeneration改名为DefNewGeneration,然后把新加的并行版叫做ParNewGeneration。

这些XXXGeneration都在HotSpot VM的“分代式GC框架”内。本来HotSpot VM鼓励开发者尽量在这个框架内开发GC,但后来有个开发就是不愿意被这框架憋着,自己硬写了个没有使用已有框架的新并行GC,并拉拢性能测试团队用这个并行GC来跑分,成绩也还不错,于是这个GC就放进HotSpot VM里了。这就是我们现在看到的ParallelScavenge。

(结果就是HotSpot GC组不得不维护两个功能几乎一样、但各种具体细节不同的并行GC。其实是件很头疼的事情嗯)

Scavenge或者叫scavenging GC,其实就是copying GC的另一种叫法而已。HotSpot VM里的GC都是在minor GC收集器里用scavenging的,DefNew、ParNew和ParallelScavenge都是,只不过DefNew是串行的copying GC,而后两者是并行的copying GC。

由此名字就可以知道,“ParallelScavenge”的初衷就是把“scavenge”给并行化。换句话说就是把minor GC并行化。至于full GC,那不是当初关注的重点。

把GC并行化的目的是想提高GC速度,也就是提高吞吐量(throughput)。所以其实ParNew与ParallelScavenge都可叫做Throughput GC。

但是在HotSpot VM的术语里“Throughput GC”通常特指“ParallelScavenge”。

ParallelScavenge和ParNew都是并行GC,主要是并行收集young gen,目的和性能其实都差不多。最明显的区别有下面几点:

  1. PS以前是广度优先顺序来遍历对象图的,JDK6的时候改为默认用深度优先顺序遍历,并留有一个UseDepthFirstScavengeOrder参数来选择是用深度还是广度优先。在JDK6u18之后这个参数被去掉,PS变为只用深度优先遍历。ParNew则是一直都只用广度优先顺序来遍历
  2. PS完整实现了adaptive size policy,而ParNew及“分代式GC框架”内的其它GC都没有实现完(倒不是不能实现,就是麻烦+没人力资源去做)。所以千万千万别在用ParNew+CMS的组合下用UseAdaptiveSizePolicy,请只在使用UseParallelGC或UseParallelOldGC的时候用它。
  3. 由于在“分代式GC框架”内,ParNew可以跟CMS搭配使用,而ParallelScavenge不能。当时ParNew GC被从Exact VM移植到HotSpot VM的最大原因就是为了跟CMS搭配使用。
  4. 在PS成为主要的throughput GC之后,它还实现了针对NUMA的优化;而ParNew一直没有得到NUMA优化的实现。
还有一点要注意:上面说ParallelScavenge并行收集young gen,那old/perm gen呢?

其实最初的ParallelScavenge的目标只是并行收集young gen,而full GC的实际实现还是跟serialGC一样。只不过因为它没有用HotSpot VM的generational GCframework,自己实现了一个CollectedHeap的子类ParallelScavengeHeap,里面都弄了独立的一套接口,而跟HotSpot当时其它几个GC不兼容。其实真的有用的代码大部分就在PSScavenge(=“ParallelScavenge的Scavenge”)里,也就是负责minor GC的收集器;而负责fullGC的收集器叫做PSMarkSweep(=“ParallelScavengeMarkSweep”),其实只是在serialGC的核心外面套了层皮而已,骨子里是一样的LISP2算法的mark-compact收集器(别被名字骗了,它并不是一个mark-sweep收集器)。
当启用-XX:+UseParallelGC时,用的就是PSScavenge+PSMarkSweep的组合。
这是名副其实的“ParallelScavenge”——只并行化了“scavenge”。

所以其实非要说对应关系的话,PSScavenge才是真的跟ParNew对等的东西;ParallelScavenge这个名字既指代整套新GC,也可指代其真正卖点的PSScavenge。

不知道后来什么原因导致full GC的并行化并没有在原本的generational GC framework上进行,而只在ParallelScavenge系上进行了。其成果就是使用了LISP2算法的并行版的full GC收集器,名为PSCompact(=“ParallelScavenge-MarkCompact”),收集整个GC堆。

当启用-XX:+UseParallelOldGC时,用的就是PSScavenge+PSCompact的组合。
此时ParallelScavenge其实已经名不符实了——它不只并行化了“scavenge”(minor GC),也并行化了“mark-compact”(full GC)。

参考:https://blogs.oracle.com/jonthecollector/our-collectors

Parallel Scavenge无法和CMS共同使用相关推荐

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

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

  2. 【Java 虚拟机原理】垃圾收集器 ( Serial | ParNew | Parallel Scavenge | CMS | Serial Old - MSC | Parallel Old )

    文章目录 前言 一.HotSpot 虚拟机的垃圾收集器 二.年轻代垃圾收集器 1. 串行收集器 ( Serial ) 2. ParNew 收集器 3. Parallel Scavenge 收集器 二. ...

  3. JVM七大垃圾回收器上篇Serial、ParNeW、Parallel Scavenge、 Serial Old、 Parallel Old、 CMS、 G1

    GC逻辑分类 垃圾收集器没有在规范中进行过多的规定,可以由不同的厂商.不同版本的JVM来实现. 由于JDK的版本处于高速迭代过程中,因此Java发展至今已经衍生了众多的GC版本. 从不同角度分析垃圾收 ...

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

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

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

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

  6. java Parallel gc_JVM Parallel Scavenge GC日志详解

    Parallel Scavenge 日志格式 -XX:+PrintGCDetails [GC (Allocation Failure) [PSYoungGen: 127520K->20064K( ...

  7. 在linux上gc日志详解,JVM Parallel Scavenge GC日志详解

    Parallel Scavenge 日志格式 -XX:+PrintGCDetails [GC (Allocation Failure) [PSYoungGen: 127520K->20064K( ...

  8. 解决FileZilla 报错“无法和 SFTP 服务器建立 FTP 连接,请选择合适的协议”

    FileZilla是一个免费开源的FTP软件,可以快速方便的实现PC与服务器之间文件传输. 建立SFTP连接流程: 1. 云服务器创建 SSH 登录账号和密码 2.确认云服务器允许端口号20/21/2 ...

  9. Hbuilder未检测到手机或模拟器请重试、苹果手机无法和hbuderx 联机调试

    今天开始学习uniapp 发现自己苹果6无法和hbuderx 联机调试,提示说未检测到手机或模拟器请重试.手机用数据线连着win10电脑了,也用手机点击信任了.这么回事?? 幸好以前,给苹果手机刷过系 ...

  10. ZGC、G1与Parallel Scavenge吞吐量及停顿时间对比

    前言 关于各GC间对比的官网描述 翻译: Parallel GC 只能作为一个整体来压缩和回收老年代的空间.G1 逐渐将这项工作分布到多个更短的集合中.这会以潜在的吞吐量为代价大大缩短暂停时间. G1 ...

最新文章

  1. 进程通信学习笔记(Posix消息队列)
  2. angular 管道
  3. SSIS中的容器和数据流—举例说明数据转换任务
  4. HTML--三种样式插入方法--链接---表格---列表
  5. VTK:PolyData之GetMiscPointData
  6. linux 命令-- touch
  7. tf.reshape()
  8. Tail Recursion尾递归
  9. 带你自学Python系列(十六):Python中类的用法(二)
  10. c语言三级上机题库,2006年9月全国等级考试三级c语言上机题库(三十四)
  11. context.Request.Files post 上传问题件
  12. 连载四:Oracle升级文章大全(完结篇)
  13. vnpy怎么创建策略并回测_基于vnpy、rqdata的回测打通历程
  14. think php上传图片,基于ThinkPHP5.0实现图片上传插件
  15. 【机械仿真】基于matlab GUI 汽车悬架(钢板弹簧+减震器)设计【含Matlab源码 1631期】
  16. css整理-03 文本
  17. 《Android开发卷——HTTP网络通信,HTTP网络连接》
  18. access如何查询两张表的内容_在Excel中使用SQL语句实现精确查询
  19. 密西根州立大学计算机qs分数,2020年密歇根州立大学QS世界排名
  20. 华为日历怎么显示一月_华为手机日历怎么设置

热门文章

  1. 只查看ett.txt文件(100行内,20-30行内容)
  2. 程序员也需要知道的经济学通识
  3. iis服务器安装帝国网站,安装帝国cms如何配置iis
  4. 偏微分 python_基于Python求解偏微分方程的有限差分法.doc
  5. 点线面的特点_描述点线面状事物分布特征
  6. 华为社招机试卷经验总结
  7. go语言打印日期_专访Go语言布道师Dave Cheney:Go语言这十年,只能用“成功”一词总结...
  8. 动圈耳机振膜_耳机必看!谈动圈式耳机振膜技术
  9. [导入]冰刃Icesword 1.22测试版发布
  10. 线性代数 矩阵相似对角化的理解