ParNew 和 PSYoungGen 和 DefNew 是一个东西么?
xgj1988
2013-04-02
感觉很奇怪。我PrintGCDetails 之后。 是
[GC [PSYoungGen: 9031K->768K(18432K)] 17223K->8960K(38912K), 0.0054677 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 而书上是 DefNew ,网上有的是ParNew , 是不是不同虚拟机版本的名字不一样。我的版本信息如下: java version "1.6.0_43" Java(TM) SE Runtime Environment (build 1.6.0_43-b01) Java HotSpot(TM) 64-Bit Server VM (build 20.14-b01, mixed mode) |
|
水中石头
2013-04-03
只有一个核就是defnew,多个核就是parnew
|
|
xgj1988
2013-04-03
那我的机子是PSYoungGen 作何解释呢?
|
|
水中石头
2013-04-03
并行收集young区
|
|
xgj1988
2013-04-03
水中石头 写道 并行收集young区
那不就是新生代么。YOUNG应该就是新生代吧。 和其他两个有区别?为什么不叫PSNewGen而是 PSYoungGen呢? |
|
xgj1988
2013-04-06
查了一下书:是这样的。
串行收集器: DefNew:是使用-XX:+UseSerialGC(新生代,老年代都使用串行回收收集器)。 并行收集器: ParNew:是使用-XX:+UseParNewGC(新生代使用并行收集器,老年代使用串行回收收集器)或者-XX:+UseConcMarkSweepGC(新生代使用并行收集器,老年代使用CMS)。 PSYoungGen:是使用-XX:+UseParallelOldGC(新生代,老年代都使用并行回收收集器)或者-XX:+UseParallelGC(新生代使用并行回收收集器,老年代使用串行收集器) garbage-first heap:是使用-XX:+UseG1GC(G1收集器) |
|
RednaxelaFX
2013-04-10
呃。HotSpot VM的GC组老人之一Jon Masamitsu很久之前就写过blog讲解这个:https://blogs.oracle.com/jonthecollector/entry/our_collectors
简单来说,有这么多东西反映了HotSpot VM的开发历史和实现细节。我在写篇东西讲述这部分历史,哪天写完的话在这边也放个链接嗯。 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的实际实现还是跟serial GC一样。只不过因为它没有用HotSpot VM的generational GC framework,自己实现了一个CollectedHeap的子类ParallelScavengeHeap,里面都弄了独立的一套接口,而跟HotSpot当时其它几个GC不兼容。其实真的有用的代码大部分就在PSScavenge(=“ParallelScavenge的Scavenge”)里,也就是负责minor GC的收集器;而负责full GC的收集器叫做PSMarkSweep(=“ParallelScavenge的MarkSweep”),其实只是在serial GC的核心外面套了层皮而已,骨子里是一样的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)。 |
|
xgj1988
2013-04-12
高手就是高手。 厉害,知识面真的很广。每次你回答问题,都不没少过200字。
|
|
RednaxelaFX
2013-04-13
xgj1988 写道 高手就是高手。 厉害,知识面真的很广。每次你回答问题,都不没少过200字。
呃呵呵。稍微更新了几句上面的回复。可以再留意一下。 至于字数…只是我不知道如何写短而已,还没足够能力把大量信息精炼下来。 |
|
ls5231
2019-07-17
从Java se 7u4版本开始,应用-XX:+UseParallelGC参数后, 参数UseParallelOldGC 默认也会开启,参考的版本releaseNote
https://www.oracle.com/technetwork/java/javase/7u4-relnotes-1575007.html |