HotSpot的7种垃圾收集器组合

HotSpot共有7种垃圾收集器,3个新生代垃圾收集器,3个老年代垃圾收集器,以及G1,一共构成7种可供选择的垃圾收集器组合。

新生代与老年代垃圾收集器之间形成6种组合,每个新生代垃圾收集器都对应2种组合。

Serial Old(MSC)可以与所有新生代收集器进行组合,共3种组合
JVM仅指定新生代垃圾收集器的情况下,默认老年代采用Serial Old垃圾收集器(带压缩):
-XX:+UseSerialGC
Serial (DefNew) + Serial Old(Serial Mark Sweep Compact)

-XX:+UseParNewGC
Parallel (ParNew) + Serial Old(Serial Mark Sweep Compact)

-XX:+UseParallelGC
Parallel Scavenge (PSYoungGen) + Serial Old(Serial Mark Sweep Compact (PSOldGen))

注:在Parallel Scavenge收集器架构中本身有PS MarkSweep收集器来进行老年代收集,但由于PS MarkSweep与Serial Old实现非常接近,因此官方的许多资料都直接以Serial Old代替PS MarkSweep进行讲解。

Parallel Old(带压缩)只能与Parallel Scavenge进行组合
-XX:+UseParallelOldGC
Parallel Scavenge (PSYoungGen) + Parallel Mark Sweep Compact (ParOldGen)

CMS(不带压缩)可以与Serial和ParNew进行组合,共2种组合
-XX:-UseParNewGC -XX:+UseConcMarkSweepGC
Serial (DefNew) + CMS(Concurrent Mark Sweep)

-XX:+UseParNewGC -XX:+UseConcMarkSweepGC
Parallel (ParNew) + CMS(Concurrent Mark Sweep) + Serial Old(Serial Mark Sweep Compact)

G1(Garbage First),不需要搭配其他垃圾收集器
-XX:+UseG1GC

6种垃圾收集组合关系图

blogs.oracle.com/jonthecolle…

www.oracle.com/technetwork…
新生代垃圾收集器
所有新生代垃圾收集器,都使用复制算法,都会发生stop-the-world。由于绝大多数对象的生命周期通常比较短,在新生代被回收的可能性很大,新生代的垃圾回收通常可以回收大部分对象,因此采用复制算法效率更高。

Serial
采用复制算法,GC时发生stop-the-world,使用单个GC线程。
"Serial" is a stop-the-world, copying collector which uses a single GC thread.

ParNew
采用复制算法,GC时发生stop-the-world,使用多个GC线程。
ParNew 与 Parallel Scavenge的一个主要区别是,ParNew可以与CMS进行搭配使用。

"ParNew" is a stop-the-world, copying collector which uses multiple GC threads. It differs from "Parallel Scavenge" in that it has enhancements that make it usable with CMS. For example, "ParNew" does the synchronization needed so that it can run during the concurrent phases of CMS.

Parallel Scavenge
采用复制算法,GC时发生stop-the-world,使用多个GC线程。 吞吐量优先收集器 ,可控制最大垃圾收集停顿时间(-XX:MaxGCPauseMillis)与吞吐量大小(-XX:GCTimeRatio),支持GC自适应的调节策略(GC Ergonomics,对应参数-XX:+UseAdaptiveSizePolicy)。

"Parallel Scavenge" is a stop-the-world, copying collector which uses multiple GC threads.

老年代垃圾收集器
除了CMS,其他的老年代垃圾收集器GC时都是stop-the-world,都会在清理垃圾之后进行压缩整理。
Serial Old
采用标记整理算法,GC时发生stop-the-world,使用单个GC线程。
"Serial Old" is a stop-the-world, mark-sweep-compact collector that uses a single GC thread.

CMS
CMS采用标记清理算法,是一个以低暂停时间为目标的垃圾收集器。GC时大部分时间并发执行,其中初始化标记和重新标记两个阶段仍然会发生stop-the-world,其余阶段都是并发执行。
"CMS" is a mostly concurrent, low-pause collector.

Java之CMS GC的7个阶段: mp.weixin.qq.com/s/vmnBlrM7p…

Parallel Old
采用标记整理算法,GC时发生stop-the-world,使用多个GC线程。
"Parallel Old" is a compacting collector that uses multiple GC threads.

G1
G1将整个堆划分为多个大小相等的独立区域(Region),保留新生代和老年代的分代概念(但两者不再是物理隔离的)。

从整体来看是基于标记整理算法,从局部(两个Region之间)来看是基于复制算法。因此,可以避免产生内存空间碎片,防止发生并发模式失败。

使用多个GC线程,每次优先回收价值最大的Region。
支持可预测的停顿时间模型,从而提高收集效率,降低stop-the-world的时间。
The Garbage First or G1 garbage collector is available in Java 7 and is designed to be the long term replacement for the CMS collector. The G1 collector is a parallel, concurrent, and incrementally compacting low-pause garbage collector that has quite a different layout from the other garbage collectors described previously.

推荐使用的2种GC组合
1.基于低停顿时间的垃圾收集器
-XX:+UseConcMarkSweepGC(该参数隐式启用-XX:+UseParNewGC)

原文地址:http://blog.51cto.com/13981400/2341112

时间: 2024-10-09 10:43:55

HotSpot的7种垃圾收集器组合的相关文章

JVM(HotSpot)7种垃圾收集器

7种垃圾收集器作用于不同的分代,如果两个收集器之间存在连续,就说明他们可以搭配使用. 从JDK1.3到现在,从Serial收集器->Parallel收集器->CMS->G1,用户线程停顿时间不断缩短,但仍然无法完全消除. 1.Serial收集器(串行收集器) Serial收集器是最基本.发展历史最悠久的收集器,曾是(JDK1.3.1之前)虚拟机新生代收集的唯一选择. Serial收集器是一个单线程的收集器.“单线程”的意义不仅仅是它只会使用一个CPU或一条收集器线程去完成垃圾收集工作,更

JVM之几种垃圾收集器简单介绍

本文中的垃圾收集器研究背景为:HotSpot+JDK1.7 一.垃圾收集器概述 如上图所示,垃圾回收算法一共有7个,3个属于年轻代.三个属于年老代,G1属于横跨年轻代和年老代的算法. JVM会从年轻代和年老代各选出一个算法进行组合,连线表示哪些算法可以组合使用 二.各个垃圾收集器说明 1.Serial(年轻代) 年轻代收集器,可以和Serial Old.CMS组合使用 采用复制算法 使用单线程进行垃圾回收,回收时会导致Stop The World,用户进程停止 client模式年轻代默认算法 G

Java虚拟机七种垃圾收集器比较

1.Serial收集器曾经是虚拟机新生代收集的唯一选择,是一个单线程的收集器,在进行收集垃圾时,必须stop the world,它是虚拟机运行在Client模式下的默认新生代收集器. 2.Serial Old是Serial收集器的老年代版本,同样是单线程收集器,使用标记整理算法. 3.ParNew收集器是Serial收集器的多线程版本,许多运行在Server模式下的虚拟机中首选的新生代收集器,除Serial外,只有它能与CMS收集器配合工作. 4.Parallel Scavenge收集器也是新

JVM常见的七种垃圾收集器的简单比较

1.Serial收集器曾经是虚拟机新生代收集的唯一选择,是一个单线程的收集器,在进行收集垃圾时,必须stop the world,它是虚拟机运行在Client模式下的默认新生代收集器. 2.Serial Old是Serial收集器的老年代版本,同样是单线程收集器,使用标记整理算法. 3.ParNew收集器是Serial收集器的多线程版本,许多运行在Server模式下的虚拟机中首选的新生代收集器,除Serial外,只有它能与CMS收集器配合工作. 4.Parallel Scavenge收集器也是新

java虚拟机常见的几种垃圾收集器简介

新生代收集器        Serial收集器 它是最基本.历史最悠久的收集器,在JDK1.3.1之前是虚拟机新生代收集的唯一选择.它是一个单线程的收集器,到现在为止,它依然是虚拟机运行在Client模式下的默认的新生代收集器.优点:简单高效. 特点:只会使用一个CPU或一条收集线程去完成垃圾收集工作,在进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束.它没有线程交互的开销,所以可以获得最高的单线程收集效率.   ParNew收集器 Serial收集器的多线程版本,除了使用多条线程进行

深入理解JVM读书笔记二: 垃圾收集器与内存分配策略

3.2对象已死吗? 3.2.1 引用计数法 给对象添加一个引用计数器,每当有一个地方引用它的地方,计数器值+1:当引用失效,计数器值就减1;任何时候计数器为0,对象就不可能再被引用了. 它很难解决对象之间相互循环引用的问题. 3.2.2 可达性分析算法 这个算法的基本思路就是通过一系列的称为"GC Roots"的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连(用图论的话来说,就是从GC

003 垃圾收集器与内存分配策略

1.概述 程序计数器.虚拟机栈.本地方法栈是线程私有的,内存分配和回收都具有确定性,不需要考虑垃圾回收的问题,方法结束或者线程结束,内存就自然回收了 java堆和方法区的内存的分配和回收都是动态的,垃圾收集器所关注的是这部分的内存 2.垃圾收集器处理的对象 垃圾收集器需要确定哪些对象还"存活"着,哪些已经"死去"(不可能再被任何途径使用的对象) ①引用计数算法 给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1:当引用失效时,计数器值就减1:任何时刻

深入理解JAVA虚拟机 垃圾收集器和内存分配策略

引用计数算法 很多教科书判断对象是否存活的算法是这样的:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1:当引用失效时,计数器值就减1:任何时刻计数器都为0的对象就是不可能再被使用的. 客观地说,引用计数算法(Reference Counting)的实现简单,判定效率也很高,在大部分情况下它都是一个不错的算法,也有一些比较著名的应用案例,例如微软的COM(Component Object Model)技术.使用ActionScript 3的FlashPlayer.Python语

深入理解java虚拟机----->垃圾收集器与内存分配策略(下)

1.  前言 内存分配与回收策略 JVM堆的结构分析(新生代.老年代.永久代) 对象优先在Eden分配 大对象直接进入老年代 长期存活的对象将进入老年代 动态对象年龄判定 空间分配担保  2.  垃圾收集器与内存分配策略 Java技术体系中所提倡的自动内存管理最终可以归结为自动化地解决两个问题: 给对象分配内存; 回收分配给对象的内存. 对象的内存分配,往大方向上讲就是在堆上的分配,对象主要分配在新生代的Eden区上.少数也可能分配在老年代,取决于哪一种垃圾收集器组合,还有虚拟机中的相关内存的参