02 java难点

垃圾收集器与内存分配策略(三)——七种垃圾收集器

2019-07-14  本文已影响0人  路远处幽

如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。Java虚拟机规范中对垃圾收集器应该如何实现并没有任何规定,因此不同厂商、不同版本的虚拟机所提供的垃圾收集器可能会有很大差别。这里讨论的收集器基于JDK 1.7 Update 14之后的HotSpot虚拟机(在这个版本中正式提供了商用的G1收集器,之前G1仍然处于试验状态,JDK11已经作为默认的收集器),这个虚拟机所包含的所有收集器如下图:


Se

一、Serial收集器(新生代)

最原生的收集器, jdk1.3以前唯一的选择.
单线程收集器. 这里并不是指使用一个CPU或一条收集线程去完成垃圾收集工作, 而是指它在收集垃圾时, 必须暂停用户工作线程(Stop The World).


image.png

二、ParNew收集器(新生代)

ParNew是Serial的多线程版本


image.png

三、Parallel Scavenge收集器(新生代)

吞吐量优先收集器,Parallel Scavenge和ParNew一样都是并行的多线程、新生代收集器,都使用"复制"算法(Stop-The-World)进行垃圾回收。
ParNew收集器追求降低GC时用户线程的停顿时间,适合交互式应用,良好的反应速度提升用户体验。
Parallel Scavenge追求可控的CPU吞吐量,能够在较短的时间内完成指定任务,适合不需太多交互的后台运算。


image.png

四、Serial Old收集器(老年代)

Serial的老年代版本,都是单线程收集器,GC时只启动一条GC线程,因此都适合客户端应用.
它们唯一的区别就是:Serial Old工作在老年代,使用"标记-整理"算法;Serial工作在新生代,使用"复制"算法。

五、Parallel Old收集器(老年代)

Parallel Scavenge收集器的老年代版本。
在jdk1.6之前, 如果新生代选择了Parallel Scaenge收集器, 老年代除了Serial Old(PS Mark Sweep)收集器外别无选择.( 上面说过, Parallel Scavenge收集器无法与CMS-Concurrent Mark Sweep收集器搭配工作)。但是现在可以使用Parallel Scavenge + Parallel Old组合. 而不必像之前那样Prallel Scavenge + Serial Old组合.

六、CMS收集器(老年代)

(Concurrent Mark Sweep Collector) : 低延迟为先!
回收停顿时间比较短、目前比较常用的垃圾回收器。它通过初始标记(InitialMark)、并发标记(Concurrent Mark)、重新标记( Remark)、并发清除( Concurrent Sweep )四个步骤完成垃圾回收工作。


image.png

有两步需要"Stop The World":初始标记和重新标记。

CMS的缺点:

CMS应用场景:
目前很大一部分的Java应用集中在互联网网站或B/S系统的服务端上,这类应用尤其重视服务的响应速度,希望系统停时间最短,以给用户带来较好的体验。CMS收集器非常符合这类应用的需求。

七、G1收集器(万能收集器)

Hotspot 在JDK7中推出了新一代 G1 ( Garbage-First Garbage Collector )垃圾回收,通过

-XX:+UseG1GC

参数启用
和CMS相比,Gl具备压缩功能,能避免碎片向題,G1的暂停时间更加可控。性能总体还是非常不错的,G1是当今最前沿的垃圾收集器成果之一.


image.png

G1收集器相关概念

G1收集器特点:

G1垃圾收集过程

S0/S1的功能由G1中的Survivor region来承载,通过GC日志可以观察到完整的垃圾回收过程如下,其中就有Survivor regions的区域从0个到1个


image.png

红色标识的为G1中的四种region,都处于Heap中.
G1执行时使用4个worker并发执行,在初始标记时,还是会触发STW,如第一步所示的Pause

上一篇下一篇

猜你喜欢

热点阅读