https://www.cnblogs.com/parryyang/p/5750146.htmlhtml
JVM根据需求不一样提供了三种选择:串行收集器、并行收集器、并发收集器java
并行:指多条垃圾收集器线程并行工做,但此时还是“Stop The World”状态,即用户线程处于等待状态;算法
并发:指用户线程和垃圾收集线程同时执行(不必定是并行的,颇有多是线程交替运行),用户线程继续运行,而垃圾收集程序运行在另外一个CPU上。多线程
并行案例:并发
java -Xmx3500m -Xms3500m -Xmn2g -Xss128k -XX:+UseparallelGC - XX:ParallelGCThreans = 20 -XX:+UseParallelOldGCjvm
并发案例:spa
java -Xmx3550m -Xmm3550m -Xmn2g -Xss128K -XX:ParallelGCThread = 20 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC.net
============================================线程
注意:parnew也是并行的,而不是并发的,只是由于它能与老年代并发gc cms合做(另外一个是Serial新生代),这里归为并发,方便记忆
日志
注意:Paralled Scavenge是不是并行/并发的未知,但考虑到其复制算法,而非cms的标记清除,可能为并行算法
============================================
(1)Serial收集器
Serial收集器是最基本的收集器,这是一个单线程收集器,它“单线程”的意义不只仅是说明它只用一个线程去完成垃圾收集工做,更重要的是在它进行垃圾收集工做时,必须暂停其余工做线程,直到它收集完成。Sun将这件事称之为”Stop the world“。
没有一个收集器能彻底不停顿,只是停顿的时间长短。
虽然Serial收集器的缺点很明显,可是它仍然是JVM在Client模式下的默认新生代收集器。它有着优于其余收集器的地方:简单而高效(与其余收集器的单线程比较),Serial收集器因为没有线程交互的开销,专心只作垃圾收集天然也得到最高的效率。在用户桌面场景下,分配给JVM的内存不会太多,停顿时间彻底能够在几十到一百多毫秒之间,只要收集不频繁,这是彻底能够接受的。
(2)ParNew收集器
ParNew是Serial的多线程版本,在回收算法、对象分配原则上都是一致的。ParNew收集器是许多运行在Server模式下的默认新生代垃圾收集器,其主要在于除了Serial收集器,目前只有ParNew收集器可以与CMS收集器配合工做。
(3)Parallel Scavenge收集器
Parallel Scavenge收集器是一个新生代垃圾收集器,其使用的算法是复制算法,也是并行的多线程收集器。
Parallel Scavenge 收集器更关注可控制的吞吐量,吞吐量等于运行用户代码的时间/(运行用户代码的时间+垃圾收集时间)。直观上,只要最大的垃圾收集停顿时间越小,吞吐量是越高的,可是GC停顿时间的缩短是以牺牲吞吐量和新生代空间做为代价的。好比原来10秒收集一次,每次停顿100毫秒,如今变成5秒收集一次,每次停顿70毫秒。停顿时间降低的同时,吞吐量也降低了。
停顿时间越短就越适合须要与用户交互的程序;而高吞吐量则能够最高效的利用CPU的时间,尽快的完成计算任务,主要适用于后台运算。
新生代基本复制算法
(4)Serial Old收集器
Serial Old收集器是Serial收集器的老年代版本,也是一个单线程收集器,采用“标记-整理算法”进行回收。其运行过程与Serial收集器同样。
(5)Parallel Old收集器
Parallel Old收集器是Parallel Scavenge收集器的老年代版本,使用多线程和标记-整理算法进行垃圾回收。其一般与Parallel Scavenge收集器配合使用,“吞吐量优先”收集器是这个组合的特色,在注重吞吐量和CPU资源敏感的场合,均可以使用这个组合。
(6)CMS 收集器
CMS(Concurrent Mark Sweep)收集器是一种以获取最短停顿时间为目标的收集器,CMS收集器采用标记--清除算法,运行在老年代。主要包含如下几个步骤:(老年代惟一 标记-清除算法,内存碎片)
· 初始标记
· 并发标记
· 从新标记
· 并发清除
其中初始标记和从新标记仍然须要“Stop the world”。初始标记仅仅标记GC Root能直接关联的对象,并发标记就是进行GC Root Tracing过程,而从新标记则是为了修正并发标记期间,因用户程序继续运行而致使标记变更的那部分对象的标记记录。
因为整个过程当中最耗时的并发标记和并发清除,收集线程和用户线程一块儿工做,因此整体上来讲,CMS收集器回收过程是与用户线程并发执行的。虽然CMS优势是并发收集、低停顿,很大程度上已是一个不错的垃圾收集器,可是仍是有三个显著的缺点:
· CMS收集器对CPU资源很敏感。在并发阶段,虽然它不会致使用户线程停顿,可是会由于占用一部分线程(CPU资源)而致使应用程序变慢。吞吐量下降
· CMS收集器不能处理浮动垃圾。所谓的“浮动垃圾”,就是在并发标记阶段,因为用户程序在运行,那么天然就会有新的垃圾产生,这部分垃圾被标记事后,CMS没法在当次集中处理它们,只好在下一次GC的时候处理,这部分未处理的垃圾就称为“浮动垃圾”。也是因为在垃圾收集阶段程序还须要运行,即还须要预留足够的内存空间供用户使用,所以CMS收集器不能像其余收集器那样等到老年代几乎填满才进行收集,须要预留一部分空间提供并发收集时程序运做使用。要是CMS预留的内存空间不能知足程序的要求,这是JVM就会启动预备方案:临时启动Serial Old收集器来收集老年代,这样停顿的时间就会很长。
· 因为CMS使用标记--清除算法,因此在收集以后会产生大量内存碎片。当内存碎片过多时,将会给分配大对象带来困难,这是就会进行Full GC。
(6)G1收集器
G1收集器与CMS相比有很大的改进:
· G1收集器采用标记--整理算法实现——避免内存碎片。
· 能够很是精确地控制停顿、可预测——多个分区。
G1收集器能够实如今基本不牺牲吞吐量的状况下完成低停顿的内存回收,这是因为它极力的避免全区域的回收,G1收集器将Java堆(包括新生代和老年代)划分为多个区域(Region),并在后台维护一个优先列表,每次根据容许的时间,优先回收垃圾最多的区域 。
---------------------
做者:渐忘的歌
来源:CSDN
原文:https://blog.csdn.net/qq_35503221/article/details/80313129
版权声明:本文为博主原创文章,转载请附上博文连接!
************************************************==================================
jdk1.7 默认垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代)
jdk1.8 默认垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代)
jdk1.9 默认垃圾收集器G1
-XX:+PrintCommandLineFlagsjvm参数可查看默认设置收集器类型
-XX:+PrintGCDetails亦可经过打印的GC日志的新生代、老年代名称判断
ParNew:是使用-XX:+UseParNewGC(新生代使用并行收集器,老年代使用串行回收收集器)或者-XX:+UseConcMarkSweepGC(新生代使用并行收集器,老年代使用CMS)。
PSYoungGen:是使用-XX:+UseParallelOldGC(新生代,老年代都使用并行回收收集器)或者-XX:+UseParallelGC(新生代使用并行回收收集器,老年代使用串行收集器
注意:Paralled Scavenge是不是并行/并发的未知,图中“无需暂停”可能不许确