不同场景能够应用不同的垃圾收集器来进行GC,不同的垃圾收集器有不同的特点,有的单线程执行适宜单核、有的多线程并发执行、有的谋求高吞吐量、有的谋求低提早...

在学习垃圾收集器前须要学习肯定的前置常识如JVM运行时数据区、垃圾回收算法等,须要的同学能够查看该专栏下以前的文章,如

深入浅出JVM(二)之运行时数据区和内存溢出异样

深入浅出JVM(十二)之垃圾回收算法

深入浅出JVM(十三)之垃圾回收算法细节

垃圾收集器的内容细节都比拟多,文章将会分为上、中、下三篇

在上篇中次要介绍垃圾回收器的分类、性能指标以及串行与并行的垃圾收集器

在中篇中次要介绍并发的垃圾收集器以及并发执行带来的问题以及解决方案

在下篇中次要介绍低提早的垃圾收集器

GC分类与性能指标

垃圾回收器分类

依据GC线程数进行分类,能够分为单GC线程串行和多GC线程并行的垃圾回收器

单线程串行顾名思义就是单线程执行GC,多线程并行就是多个线程同时执行GC(须要多核)

依据GC工作模式进行分类,能够分为同一时刻GC线程独占式和用户、GC线程并发的垃圾回收器

GC线程独占式是GC线程执行时用户线程须要进展,而用户、GC线程并发式就是用户、GC线程并发执行

依据解决内存碎片进行分类,能够分为压缩式(无碎片内存)和非压缩式的垃圾回收器

依据解决内存区间进行分类,能够分为新生代、老年代的垃圾回收器

性能指标

在介绍垃圾回收器前,须要理解两个性能指标:吞吐量和提早

在程序运行时,因为GC的存在,在进行GC时须要额定的开销,咱们心愿垃圾回收器可能有高吞吐量,尽早的实现GC,将运行工夫留给用户线程去解决咱们的程序

但因为种种原因可能导致GC的工夫过长,这样就会提早用户线程的执行,咱们总是心愿这种提早是低的

GC的指标尽量谋求高吞吐量和低提早

高吞吐量示意GC解决的快,低提早在交互程序中能给用户带来好的响应

然而高吞吐量和低提早是抵触的

以高吞吐量为优先,就要缩小GC频率,这样会导致GC须要更长的工夫,从而导致提早升高

以低提早为优先,为了升高每次GC暂停更短的工夫,只能增大GC频率,这样导致吞吐量升高

当初GC的指标是在高吞吐量优先的状况下尽量升高提早;在低提早优先的状况下尽量增大吞吐量

垃圾收集器

以GC线程运行状态来分类,经典的垃圾收集器分为串行、并行、并发垃圾收集器,当初还有两款低提早垃圾收集器

串行垃圾收集器: SerialSerial Old

并行垃圾收集器: ParNewParallel Scavenge , Parallel Old

并发垃圾收集器: G1CMS

低提早垃圾收集器: ZGCShenandoah

垃圾收集器可能只解决年老代(新生代)或老年代,也可能对内存区域都进行解决

因为垃圾收集器可能只解决局部空间,因而要做到Full GC时,须要搭配其余垃圾收集器一起进行GC

比方Serial GC与Serial Old GC(图中黑线)

图中位于红色局部是解决年老代的垃圾收集器,位于灰色局部是解决老年代的垃圾收集器,其中G1都会解决

垃圾收集器之间会进行搭配应用,但在高版本中可能移除这种搭配关系,也可能移除垃圾收集器

串行垃圾收集器

串行垃圾收集器次要有两种,别离解决年老代与老年代,它们相互搭配应用

Serial收集器应用复制算法解决年老代

Serial Old收集器应用标记-整顿算法解决老年代

(新生代)Serial收集器 + (老年代)Serial Old 收集器 运行图

串行收集器(单线程),简略高效(在单线程中)、内存开销最小

收集过程中,必须暂停其余所有用户线程,直到它收集完结

默认Client模式的收集器,适宜单核CPU 不适宜交互式

JVM参数设置

-XX:+UseSerialGC :新生代应用Serial GC 老年代应用 Serial Old GC

并行垃圾收集器

ParNew收集器

ParNew是Serial的并行版本,应用复制算法解决新生代

(新生代)ParNew收集器 + (老年代)Serial Old收集器 运行图

在单核状况下,Serial会比ParNew高效;在多核状况下,ParNew吞吐量会更高

年老代应用ParNew时,老年代只能应用串行的Serial Old

JVM参数设置

-XX:+UseParNewGC新生代应用ParNew

-XX:ParallelGCThreads=线程数 并行执行的GC线程数量

Parallel Scavenge收集器 和 Parallel Old收集器

Parallel Scavenge 是吞吐量优先的并行收集器,应用复制算法解决新生代

Parallel Old 应用标记-整顿算法解决老年代

Parallel Scavenge收集器 + Parallel Old收集器运行图

与ParNew的不同:准确管制吞吐量,自适应调节策略

吞吐量越高阐明最高效率利用处理器资源实现程序

参数设置
  • -XX:UseParallelGC-XX:UseParallelOldGC相互激活

    • 新生代应用ParallelGC 老年代应用Parallel Old GC

<!---->

  • -XX:MaxGCPauseMillis

    • 最大垃圾收集进展工夫
  • -XX:GCTimeRatio

    • 管制GC工夫 -XX:GCTimeRatio=99 时 GC工夫占比 = 1 / (1 + 99) = 1%
  • -XX:+UseAdaptiveSizePolicy

    • 自适应调节策略 默认开启
    • 开启时JVM会依据零碎运行状况动静调整-XX:MaxGCPauseMillis-XX:GCTimeRatio参数来设置最合适的进展工夫和GC工夫
吞吐量优先垃圾收集器是JDK8默认应用的垃圾收集器

总结

本篇文章作为垃圾收集器系列文章的上篇,次要介绍从各个方面对垃圾收集器的分类、GC性能指标、串行垃圾收集器、并行垃圾收集器等

垃圾收集器能够划分为串行、并行、并发垃圾收集器,其中串行示意单GC线程单独执行、并行示意多GC线程同时刻执行、并发示意GC、用户线程并发执行

产生GC时须要思考到的性能指标是高吞吐量(GC执行效率高)、低提早(GC时的进展工夫尽量低),这两个指标往往不能都满足,不同的垃圾收集器有不同特点适宜在不同场景下发挥作用

串行垃圾收集器Serial应用复制算法回收年老代,搭配Serial Old应用标记-整顿算法回收老年代,适宜在单核、提早不敏感的场景下应用,Client模式下的默认垃圾收集器

并行垃圾收集器ParNew能够看成Serial的并行版本,应用复制算法多GC线程并行回收年老代,老年代应用Serial Old单GC线程回收老年代

吞吐量优先垃圾收集器Parallel Scavenge应用复制算法多GC线程并行回收年老代,搭配Parallel Old应用标记-整顿算法多GC线程并行回收老年代,提供最大进展工夫、GC工夫占比、自适应调节等参数来让用户自定义应用,Server模式下默认垃圾收集器

并发垃圾收集器以及用户、GC线程并发执行带来的问题与解决方案将在垃圾收集器系列的中篇介绍

低提早垃圾收集器将在垃圾收集器系列的下篇中介绍

最初(一键三连求求拉~)

本篇文章将被支出JVM专栏,感觉不错感兴趣的同学能够珍藏专栏哟~

本篇文章笔记以及案例被支出 gitee-StudyJava、 github-StudyJava 感兴趣的同学能够stat下继续关注喔\~

有什么问题能够在评论区交换,如果感觉菜菜写的不错,能够点赞、关注、珍藏反对一下\~

关注菜菜,分享更多干货,公众号:菜菜的后端私房菜

本文由博客一文多发平台 OpenWrite 公布!