Parallel Scavenge无法和CMS共同使用
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,目的和性能其实都差不多。最明显的区别有下面几点:
- PS以前是广度优先顺序来遍历对象图的,JDK6的时候改为默认用深度优先顺序遍历,并留有一个UseDepthFirstScavengeOrder参数来选择是用深度还是广度优先。在JDK6u18之后这个参数被去掉,PS变为只用深度优先遍历。ParNew则是一直都只用广度优先顺序来遍历
- PS完整实现了adaptive size policy,而ParNew及“分代式GC框架”内的其它GC都没有实现完(倒不是不能实现,就是麻烦+没人力资源去做)。所以千万千万别在用ParNew+CMS的组合下用UseAdaptiveSizePolicy,请只在使用UseParallelGC或UseParallelOldGC的时候用它。
- 由于在“分代式GC框架”内,ParNew可以跟CMS搭配使用,而ParallelScavenge不能。当时ParNew GC被从Exact VM移植到HotSpot VM的最大原因就是为了跟CMS搭配使用。
- 在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共同使用相关推荐
- 【Android 内存优化】垃圾回收算法 ( 分代收集算法 | Serial 收集器 | ParNew 收集器 | Parallel Scavenge 收集器 | CMS 并发标记清除收集器 )
文章目录 一. 分代收集算法 二. 垃圾回收器 / 收集器 ( GC ) 三. 串行收集器 ( Serial ) 四. ParNew 收集器 五. Parallel Scavenge 收集器 六. C ...
- 【Java 虚拟机原理】垃圾收集器 ( Serial | ParNew | Parallel Scavenge | CMS | Serial Old - MSC | Parallel Old )
文章目录 前言 一.HotSpot 虚拟机的垃圾收集器 二.年轻代垃圾收集器 1. 串行收集器 ( Serial ) 2. ParNew 收集器 3. Parallel Scavenge 收集器 二. ...
- JVM七大垃圾回收器上篇Serial、ParNeW、Parallel Scavenge、 Serial Old、 Parallel Old、 CMS、 G1
GC逻辑分类 垃圾收集器没有在规范中进行过多的规定,可以由不同的厂商.不同版本的JVM来实现. 由于JDK的版本处于高速迭代过程中,因此Java发展至今已经衍生了众多的GC版本. 从不同角度分析垃圾收 ...
- Jvm垃圾收集器总结之 Parallel Scavenge 收集器
Parallel Scavenge 收集器是个新生代收集器.它也是使用复制算法的收集器,又是并行的多线程收集器....看上去和ParNew 都一样,那它有什么特别之处呢? Parallel Scave ...
- Parallel Scavenge收集器:吞吐量优先
Parallel Scavenge收集器,是年轻代中除了ParNew以外的另一款垃圾收集器,同样采用了并行回收.复制算法和"Stop The World"机制. 那么它和ParNe ...
- java Parallel gc_JVM Parallel Scavenge GC日志详解
Parallel Scavenge 日志格式 -XX:+PrintGCDetails [GC (Allocation Failure) [PSYoungGen: 127520K->20064K( ...
- 在linux上gc日志详解,JVM Parallel Scavenge GC日志详解
Parallel Scavenge 日志格式 -XX:+PrintGCDetails [GC (Allocation Failure) [PSYoungGen: 127520K->20064K( ...
- 解决FileZilla 报错“无法和 SFTP 服务器建立 FTP 连接,请选择合适的协议”
FileZilla是一个免费开源的FTP软件,可以快速方便的实现PC与服务器之间文件传输. 建立SFTP连接流程: 1. 云服务器创建 SSH 登录账号和密码 2.确认云服务器允许端口号20/21/2 ...
- Hbuilder未检测到手机或模拟器请重试、苹果手机无法和hbuderx 联机调试
今天开始学习uniapp 发现自己苹果6无法和hbuderx 联机调试,提示说未检测到手机或模拟器请重试.手机用数据线连着win10电脑了,也用手机点击信任了.这么回事?? 幸好以前,给苹果手机刷过系 ...
- ZGC、G1与Parallel Scavenge吞吐量及停顿时间对比
前言 关于各GC间对比的官网描述 翻译: Parallel GC 只能作为一个整体来压缩和回收老年代的空间.G1 逐渐将这项工作分布到多个更短的集合中.这会以潜在的吞吐量为代价大大缩短暂停时间. G1 ...
最新文章
- 进程通信学习笔记(Posix消息队列)
- angular 管道
- SSIS中的容器和数据流—举例说明数据转换任务
- HTML--三种样式插入方法--链接---表格---列表
- VTK:PolyData之GetMiscPointData
- linux 命令-- touch
- tf.reshape()
- Tail Recursion尾递归
- 带你自学Python系列(十六):Python中类的用法(二)
- c语言三级上机题库,2006年9月全国等级考试三级c语言上机题库(三十四)
- context.Request.Files post 上传问题件
- 连载四:Oracle升级文章大全(完结篇)
- vnpy怎么创建策略并回测_基于vnpy、rqdata的回测打通历程
- think php上传图片,基于ThinkPHP5.0实现图片上传插件
- 【机械仿真】基于matlab GUI 汽车悬架(钢板弹簧+减震器)设计【含Matlab源码 1631期】
- css整理-03 文本
- 《Android开发卷——HTTP网络通信,HTTP网络连接》
- access如何查询两张表的内容_在Excel中使用SQL语句实现精确查询
- 密西根州立大学计算机qs分数,2020年密歇根州立大学QS世界排名
- 华为日历怎么显示一月_华为手机日历怎么设置
热门文章
- 只查看ett.txt文件(100行内,20-30行内容)
- 程序员也需要知道的经济学通识
- iis服务器安装帝国网站,安装帝国cms如何配置iis
- 偏微分 python_基于Python求解偏微分方程的有限差分法.doc
- 点线面的特点_描述点线面状事物分布特征
- 华为社招机试卷经验总结
- go语言打印日期_专访Go语言布道师Dave Cheney:Go语言这十年,只能用“成功”一词总结...
- 动圈耳机振膜_耳机必看!谈动圈式耳机振膜技术
- [导入]冰刃Icesword 1.22测试版发布
- 线性代数 矩阵相似对角化的理解