JVM(十五)垃圾回收器概述

JVM(十五)垃圾回收器概述


1 垃圾回收器概述

  • 垃圾收集器没有在规范中进行过多的规定,可以由不同的厂商、不同版本的JVM来实现
  • 由于JDK版本的高速迭代,Java发展至今已经衍生了众多的GC版本
  • 从不同的角度分析垃圾收集器,可以将GC分为不同的类型

2 垃圾回收器分类

  • 按照线程数分,可以分为串行垃圾回收器并行垃圾回收器

    image-20230712165557847

    串行回收指的是同一时间段内只有一个CPU用于执行垃圾回收操作,同时工作线程被暂停直至垃圾回收结束。

    在一些单CPU处理器和较小的应用内存的硬件平台不是特别优越的场合,串行回收器的性能表现可以超过并行回收器和并发回收器(线程切换造成性能消耗)。所以串行回收被应用在客户端Client模式下的JVM中。当然在一些并发能力较强的CPU上,并行回收器产生的停顿时间要低于串行回收器

    并行收集可以运行多个CPU用于执行垃圾回收,因此提高了应用的吞吐量,不过并行回收和串行回收一样采用了独占式,使用了STW机制

  • 按照工作模式分,可以分为并发垃圾回收器独占式垃圾回收器

    • 并发垃圾回收器会与应用程序线程交替执行,以尽可能地减少应用程序的停顿时间
    • 独占式垃圾回收器一旦运行,就会运行应用程序中的所有用户线程,直到垃圾回收线程完全结束
    image-20230712170537610
  • 按照碎片处理方式来分,可以分为压缩式垃圾回收器非压缩式垃圾回收器

    • 压缩式垃圾回收器在回收完成之后,对存活对象进行压缩整理,消除回收后的内存碎片
    • 非压缩式垃圾回收器不会进行这一步操作
  • 工作的内存区间划分,分为老年代垃圾回收器新生代垃圾回收器

3 GC的性能指标

  • 吞吐量运行用户代码的时间总运行时间的比例
    • 总运行时间=运行用户代码的时间+内存回收的时间
  • 垃圾收集开销:吞吐量的补数,垃圾收集所用时间与总运行时间的比例
  • 暂停时间:为了执行垃圾收集,用户线程被暂停的时间
  • 收集效率:相对于应用程序的执行,收集操作发生的概率
  • 内存占用:Java堆所占内存的大小
  • 快速响应:一个对象从诞生到被回收所经历的时间

吞吐量、暂停时间、内存占用共同构成了一个不可能三角,三者的总体表现会随着技术进步越来越好,但是一款优秀的垃圾回收器最多满足其中的两项。且随着硬件的进步内存占用越来越被容忍,应该主要抓住剩余的两点。

4 垃圾回收器的发展迭代史

  • 1999年随着JDK1.3.1一起发行的是串行方式的Serial GC,它是第一款GC,ParNew垃圾收集器是Serial GC的多线程版本
  • 2002年Parallel GCConcurrent Mark Sweep(CMS) GC随着jdk1.4.2一起发布
  • Parallel GC在JDK6之后成为HotSpot虚拟机的默认GC
  • 2012年,在JDK1.7中G1可用
  • 2017年,JDK9中G1变为默认的垃圾收集器,替代了CMS
  • 2018年3月,JDK10中的G1垃圾收集器实现了并行性来改善最坏情况下的延迟
  • 2018年9月,JDK11发布,引入Epsilon GC,又称作“No-Op”(无操作)垃圾收集器。同时引入ZGC(可伸缩的低延迟垃圾收集器)
  • 2019年3月,JDK12发布,增强G1,使得能够自动返还未用堆内存给操作系统。同时引入Shenandoah GC(低停顿时间的GC)
  • 2019年3月,JDK13发布,增强ZGC,能够自动返还未用堆内存给操作系统
  • 2020年3月,JDK14发布,删除CMS垃圾回收器,扩展ZGC在MacOS和Windows上的应用

总结为七种经典的垃圾收集器

  • 串行垃圾回收器:Serial、Serial Old
  • 并行垃圾回收器:ParNew、Parallel Scavenge、Parallel Old
  • 并发垃圾回收器:CMS、G1

七种垃圾回收器与垃圾分代之间的关系

image-20230712201520865
  • 新生代收集器:Serial GC、Parallel Scavenge GC、ParNew
  • 老年代收集器:Serial Old GC、Parallel Old GC、CMS
  • 整堆收集器:G1

5 垃圾回收器的组合关系:

image-20230712201712562
  • 实现相连的垃圾回收器表示可以搭配使用:
    • Serial GC - Serial Old GC
    • ParNew GC - CMS GC
    • Parallel Scavenge GC - Parallel Old GC
    • 还有一条CMS GC - Serial Old GC表示CMS出现“Concurrent Mode Failure”后的备选方案
  • (红色虚线)为了维护和兼容性测试的成本,在jdk1.8中将Serial GC-CMS GC的组合以及ParNew GC-Serial Old GC组合废弃了,在JDK9中进行了移除
  • (绿色虚线)JDK14弃用了Parallel Scavenge GC - Serial Old GC的组合
  • (青色虚线)JDK14删除了CMS GC

上面红色虚线的“维护和兼容性测试的成本”,主要是指的单线程垃圾收集器和多线程垃圾收集器同步工作的成本

Parallel Scavenge GC并没有和同为并行垃圾收集器的CMS配合工作,而ParNew可以的原因是Parallel Scavenge GC、Parallel Old GC所使用的架构和其他的垃圾收集器均不同

6 查看默认的垃圾回收器

  • -XX:+PrintCommandLineFlags:查看命令行相关参数(包括垃圾收集器)
  • 使用命令行指令:jinfo -flag 相关垃圾回收器参数 进程ID
posted @ 2023-07-16 14:40  Tod4  阅读(43)  评论(0编辑  收藏  举报