`
leonzhx
  • 浏览: 797523 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Zz ParNew VS DefNew VS PSYoungGen

    博客分类:
  • JVM
阅读更多

串行收集器:
DefNew:是使用-XX:+UseSerialGC(新生代,老年代都使用串行回收收集器)。
并行收集器:
ParNew:是使用-XX:+UseParNewGC(新生代使用并行收集器,老年代使用串行回收收集器)或者-XX:+UseConcMarkSweepGC(新生代使用并行收集器,老年代使用CMS)。
PSYoungGen:是使用-XX:+UseParallelOldGC(新生代,老年代都使用并行回收收集器)或者-XX:+UseParallelGC(新生代使用并行回收收集器,老年代使用串行收集器)
garbage-first heap:是使用-XX:+UseG1GC(G1收集器)

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搭配使用。

================================

还有一点要注意:上面说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)。

分享到:
评论

相关推荐

    2-6垃圾收集器ParNew&CMS底层三色标记.mp4

    2-6垃圾收集器ParNew&CMS底层三色标记.mp4

    jvm性能调优-垃圾收集器parnew&CMS底层三色标记算-performance-gc-parnew-cms.zip

    本文将深入探讨两个重要的垃圾收集器——ParNew和Concurrent Mark Sweep (CMS) ——以及它们在JVM性能调优中的作用,特别是基于三色标记算法的实现。 首先,ParNew垃圾收集器是新生代(Young Generation)的默认...

    并行回收器---新生代ParNew回收器1

    并行回收器---新生代ParNew回收器1

    java虚拟机相关知识

    [GC [DefNew: 6633K->6633K(7424K), 0.0000684 secs] [Tenured: 18740K->18820K(24576K), 0.0636505 secs] 25374K->18820K(32000K), 0.0639274 secs] ``` - **Tenured**:表示老年代的垃圾收集。“Tenured: 18740K-...

    Sun Hotspot V1.6.0 JVM GC PPT.pdf

    [GC [DefNew: 11509K->1138K(14336K), 0.0110060 secs] 11509K->1138K(38912K), 0.0112610 secs] [Times: user=0.00 sys=0.01, real=0.01 secs] ``` - **[DefNew]**:表示本次GC发生在新生代。 - **11509K->1138K...

    04-VIP-JVM垃圾收集器详解1

    ParNew收集器是Serial收集器的多线程版本,同样适用于新生代,使用复制算法,但可以并行执行垃圾收集。默认线程数与CPU核心数相同,可调整。ParNew收集器常与CMS收集器配合使用,是Server模式下的常见选择。 3. ...

    垃圾回收器(csdn)————程序.pdf

    从1999年的Serial GC开始,到ParNew、Parallel GC、CMS、G1,再到后来的Epsilon、ZGC和Shenandoah,每一代都致力于解决上一代的问题,提升性能或降低暂停时间。例如,G1在JDK9中成为默认收集器,以替代CMS,而ZGC和...

    02垃圾回收器1

    本文将深入探讨几个常见的垃圾回收器,包括Serial、Serial Old、ParNew、Parallel Scavenge、CMS以及相对较新的G1收集器。 首先,Serial GC是Java虚拟机(JVM)提供的一个基础单线程收集器,主要设计用于轻量级的...

    垃圾回收相关总结

    - **新生代GC**:新生代主要处理生命周期短的对象,主要包括Serial、Parallel Scavenge和ParNew垃圾收集器。 - **老年代和持久代GC**:针对长期存活的对象,有Serial Old、Parallel Old和CMS(Concurrent Mark ...

    7种JVM垃圾收集器特点-优劣势-及使用场景.pdf

    ParNew垃圾收集器是Serial垃圾收集器的多线程版本,它可以使用多个线程来进行垃圾收集工作。ParNew垃圾收集器适用于Server模式下的应用程序,具有较高的垃圾收集性能和较低的停顿时间。 3. Parallel Scavenge垃圾...

    AviatorEvaluator执行脚本导致Metaspace不足引发频繁 Full GC

    2020-02-17T10:17:24.672+0800: 48172.920: [GC (Allocation Failure) 2020-02-17T10:17:24.672+0800: 48172.920: [ParNew: 1756536K->14685K(1922432K), 0.0272831 secs] 1850643K->108791K(4019

    lombok-plugin-0.30-2020.1foridea.zip

    IDEA离线安装插件lombok-plugin-0.30-2020.1,请与idea版本对应好。 IntelliJ IDEA 2020.1.2 (Ultimate Edition) ...GC: ParNew, ConcurrentMarkSweep Memory: 989M Cores: 8 Non-Bundled Plugins: Lombook Plugin

    垃圾收集器优化策略1

    1. UseSerialGC 表示 “Serial” + "Serial Old"组合 2. UseParNewGC 表示 “ParNew” + “Serial

    JVM垃圾收集器全面详解

    ParNew是Serial GC的多线程版本,主要在新生代进行工作,与CMS(Concurrent Mark Sweep)垃圾收集器配合使用,适合多CPU环境。它可以减少暂停时间,但可能会增加CPU使用率。 3. **Parallel GC** Parallel GC也...

    07.垃圾回收器1

    2. **ParNew收集器**:ParNew是Serial收集器的多线程版本,专用于新生代。它允许在垃圾回收期间并行执行,但老年代仍然采用串行方式。ParNew可以与CMS收集器协同工作,以提高整体性能。可以通过`-XX:+...

    jvm 调优的详细介绍

    - **简介**:ParNew收集器是Serial收集器的多线程版本,适用于多核处理器的环境。 - **算法**:同样采用“复制”算法。 - **特点**:通过多个线程并行执行垃圾收集任务,从而显著减少了GC暂停时间。 - **配置**:...

    Java最常见200面试题以及解析

    新生代回收器:Serial、ParNew、Parallel Scavenge 老年代回收器:Serial Old、Parallel Old、CMS 整堆回收器:G1 新生代垃圾回收器一般采用的是复制算法,复制算法的优点是效率高,缺点 是内存利用率低;老年代...

    JAVA虚拟机精讲

    比如:字节码的编译原理、字节码的内部组成结构、通过源码的方式剖析HotSpot VM 的启动过程和初始化过程、Java 虚拟机的运行时内存、垃圾收集算法、垃圾收集器(重点讲解了Serial 收集器、ParNew 收集器、Parallel ...

    Android studio4.1 dart fluter插件

    Android studio4.1 dart fluter插件 Android Studio 4.1 Build #AI-201.8743.12.41.6858069, built on September 23, 2020 Runtime version: 1.8.0_242-release-1644-b01 amd64 ...Registry: ide.new.we

Global site tag (gtag.js) - Google Analytics