串行收集器:
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
本文将深入探讨两个重要的垃圾收集器——ParNew和Concurrent Mark Sweep (CMS) ——以及它们在JVM性能调优中的作用,特别是基于三色标记算法的实现。 首先,ParNew垃圾收集器是新生代(Young Generation)的默认...
并行回收器---新生代ParNew回收器1
[GC [DefNew: 6633K->6633K(7424K), 0.0000684 secs] [Tenured: 18740K->18820K(24576K), 0.0636505 secs] 25374K->18820K(32000K), 0.0639274 secs] ``` - **Tenured**:表示老年代的垃圾收集。“Tenured: 18740K-...
[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...
ParNew收集器是Serial收集器的多线程版本,同样适用于新生代,使用复制算法,但可以并行执行垃圾收集。默认线程数与CPU核心数相同,可调整。ParNew收集器常与CMS收集器配合使用,是Server模式下的常见选择。 3. ...
从1999年的Serial GC开始,到ParNew、Parallel GC、CMS、G1,再到后来的Epsilon、ZGC和Shenandoah,每一代都致力于解决上一代的问题,提升性能或降低暂停时间。例如,G1在JDK9中成为默认收集器,以替代CMS,而ZGC和...
本文将深入探讨几个常见的垃圾回收器,包括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 ...
ParNew垃圾收集器是Serial垃圾收集器的多线程版本,它可以使用多个线程来进行垃圾收集工作。ParNew垃圾收集器适用于Server模式下的应用程序,具有较高的垃圾收集性能和较低的停顿时间。 3. Parallel Scavenge垃圾...
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
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. UseSerialGC 表示 “Serial” + "Serial Old"组合 2. UseParNewGC 表示 “ParNew” + “Serial
ParNew是Serial GC的多线程版本,主要在新生代进行工作,与CMS(Concurrent Mark Sweep)垃圾收集器配合使用,适合多CPU环境。它可以减少暂停时间,但可能会增加CPU使用率。 3. **Parallel GC** Parallel GC也...
2. **ParNew收集器**:ParNew是Serial收集器的多线程版本,专用于新生代。它允许在垃圾回收期间并行执行,但老年代仍然采用串行方式。ParNew可以与CMS收集器协同工作,以提高整体性能。可以通过`-XX:+...
- **简介**:ParNew收集器是Serial收集器的多线程版本,适用于多核处理器的环境。 - **算法**:同样采用“复制”算法。 - **特点**:通过多个线程并行执行垃圾收集任务,从而显著减少了GC暂停时间。 - **配置**:...
新生代回收器:Serial、ParNew、Parallel Scavenge 老年代回收器:Serial Old、Parallel Old、CMS 整堆回收器:G1 新生代垃圾回收器一般采用的是复制算法,复制算法的优点是效率高,缺点 是内存利用率低;老年代...
比如:字节码的编译原理、字节码的内部组成结构、通过源码的方式剖析HotSpot VM 的启动过程和初始化过程、Java 虚拟机的运行时内存、垃圾收集算法、垃圾收集器(重点讲解了Serial 收集器、ParNew 收集器、Parallel ...
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