Parallel Scavenge无法和CMS共同使用_努力的土豆的博客-程序员ITS301

技术标签: JVM  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,目的和性能其实都差不多。最明显的区别有下面几点:

  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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/twt936457991/article/details/89736582

智能推荐

九度OJ 题目1196:成绩排序_sjf0115的博客-程序员ITS301

/********************************* * 日期:2013-2-8* 作者:SJF0115 * 题号: 九度OJ 题目1196:成绩排序* 来源:http://ac.jobdu.com/problem.php?pid=1196* 结果:AC * 来源:2009年华中科技大学计算机研究生机试真题* 总结:***********

安装 arm-linux-gdb7.5 & 可能出现的两类问题解决_Capture_BBoM的博客-程序员ITS301

一般的安装过程可参考文章:http://blog.csdn.net/kangear/article/details/8635029安装过程,如下:下载gdb-7.5.tar.gz(http://www.gnu.org/software/gdb/download/)1、将gdb-7.5.tar.gz拷贝到/usr/local/目录下(可以拷贝到任何你愿意的

TreeSet,HashSet排序和去重的坑_Plusroax的博客-程序员ITS301_hashset去重的坑

先看下面一段代码:package 类集;import java.util.Set;import java.util.TreeSet;class Person{ private String name ; private int age ; public Person(String name,int age){ this.name = name ; this.age = age ; } public String gtoStr

python导入库的方法步骤_python如何添加安装library库_code4f的博客-程序员ITS301

库的使用是十分常见的,大家经常使用库的时候,肯定要知道怎么去安装他们吧,本期就教大家安装的方法,一起来看下吧~关于安装库一共有两个方法方法1:下载源码,命令行运行setup.py install安装在pipy,github等网站,下载源码,往往都是.tar.gz,.zip的压缩包,解压后,打开windows的cmd,切换到对应目录,运行:setup.pyinstall即可安装。建议提前阅读一下R...

KD-tree_priority_ez的博客-程序员ITS301_kd-tree与octtree

bzoj4520 bzoj2850√Ax+By<CAx+By<C bzoj4605 bzoj2648 bzoj2716插入点时要每插入n√\sqrt n个点重构一次 //查询一个点到另一个点的最短曼哈顿距离 int gdis(node a,node now){ //询问的当前点到搞到的kd-tree的矩形的距离 int res=0;

玩转Win10的45个快捷键_xosg的博客-程序员ITS301

  1Win10快捷键大全(第一部分)   Win10发布已经快两个星期了,各项新功能也让小伙伴们兴奋不已。和之前系统一样,Win10也加入了很多经典的快捷键,同时还加入了全新触控手势。今天小编就将所有的Win10快捷键汇总一下,希望能对你的使用有所帮助。   点击参加1分钟都不用的Win10调查问卷,赢取正版Win10官方定制精美礼品! 软件名称: ...

随便推点

mysql 批量插入guid_mysql – GUID与自动增量插入性能_苏子白的博客-程序员ITS301

我正在测试具有大量数据的表中自动增量整数与GUID(v4)之间的插入性能.在blog post之后,我期待看到差异.但是现在有超过600万行,我认为没有任何区别.这些是我的表的定义:自动递增CREATE TABLE `auto` (`id` BIGINT(20) NOT NULL AUTO_INCREMENT,PRIMARY KEY (`id`))GUIDCREATE TABLE `guid` (...

oracle analyzed,Oracle analyze table的使用总结_不穿衣服的石头的博客-程序员ITS301

select table_name,index_name,blevel,leaf_blocks,distinct_keys,avg_leaf_blocks_per_key avg_leaf_blocks,avg_data_blocks_per_key avg_data_blocks,clustering_factor,num_rows fromuser_indexeswhere table_nam...

使用ActiveX插件时object显示问题,div被object标签遮挡的解决方案_云端的幻影的博客-程序员ITS301

浏览器中object显示问题起因解决方案方法一: 直接设置属性值方法二:iframe结论起因设计要求视频控制面板显示在视频界面上,如下图红框内所示。但是因为object不在文档流之中,所以不论别的元素设置z-index多高,都只会被object元素遮住而无法看到。object元素代码如下&lt;object id="EZUIKit" width="400" height="4...

python循环输入字符串_python基础:条件循环字符串_weixin_39834154的博客-程序员ITS301

1、完成完整的温度转换程序while True:a = int(input('摄氏温度转换为华氏温度请按1\n华氏温度转换为摄氏温度请按2\n'))if a == 1:# 输入温度s = float(input('请输入摄氏温度:'))# 转换温度c = s * 9 / 5 + 32# 输出输出结果print("摄氏温度{}转换为华氏温度为:{}".format(s, c))elif a == 2...

BP神经网络python简单实现2(性能优化)_liu_coding的博客-程序员ITS301_bp数字识别模型识别率低python

这一版本主要是对 http://blog.csdn.net/net_wolf_007/article/details/52055718 实现的版本进行优化上一版本主要是根据理论知识实现简单版本,步聚比较清晰。里面存在严重的性能问题,对激活函数的扩展问题及不能批量训练等主要问题。性能上在 http://blog.csdn.net/net_wolf_007/article/details/52

linux线程同步等待队列,msgget,Linux多线程同步的消息队列命令——深圳培训linux..._江东的铁壁的博客-程序员ITS301

本文,主要讲的是Linux多线程同步之消息队列,Linux多线程同步之消息队列,msgget用于创建一个新队列或打开一个现存的队列。msgsnd将新消息加入到消息队列中;每个消息包括一个long型的type;和消息缓存;msgrcv用于从队列中取出消息;取消息很智能,不一定先进先出。消息队列是消息的链表,存放在内核中并有消息队列标示符标示。msgget用于创建一个新队列或打开一个现存的队列。msg...