17_1_垃圾回收器_GC分类与性能指标、概述、Serial、ParNew、Parallel、CMS、面试

本文详细介绍了GC分类、评估指标,包括Serial、ParNew、Parallel、CMS和G1等经典收集器的历史发展、工作原理、性能优劣以及面试要点。掌握这些有助于理解并优化JVM内存管理。

1、GC分类与性能指标

1.1、GC分类

  1. 按线程数分(垃圾回收线程数),可以分为串行垃圾回收器和并行垃圾回收器。
    串行回收默认被应用在客户端的Client模式下的JVM中
    在这里插入图片描述

  2. 按照工作模式分,可以分为独占式垃圾回收器(Stop the World)和并发式垃圾回收器。
    在这里插入图片描述

  3. 按碎片处理方式分,可分为压缩式垃圾回收器(指针碰撞)和非压缩式垃圾回收器(空闲列表)。

  4. 按工作的内存区间分,又可分为年轻代垃圾回收器和老年代垃圾回收器。

1.2、评估GC的性能指标

  1. 吞吐量 = 运行用户代码的时间 / ( 运行用户代码的时间 + 内存回收的时间)
    吞吐量优先,意味着在单位时间内,STW的时间最短。必然需要降低内存回收的执行频率。

  2. 垃圾收集开销:吞吐量的补数,垃圾收集所用时间与总运行时间的比例。

  3. 暂停时间:执行垃圾收集时,程序的工作线程被暂停的时间。
    暂停时间优先,意味着尽可能让单次STW的时间最短。只能频繁的执行内存回收

  4. 收集频率:相对于应用程序的执行,收集操作发生的频率。

  5. 内存占用:Java堆区所占的内存大小。

  6. 快速:一个对象从诞生到被回收所经历的时间。

    吞吐量、暂停时间、内存占用这三者共同构成一个“不可能三角”,主要抓住两点:吞吐量、暂停时间

    现在JVM调优标准:在最大吞吐量优先的情况下,降低停顿时间(在可控的暂停时间内,尽量增加吞吐量)。

2、不同的垃圾回收器概述

2.1、垃圾回收器的发展

有了虚拟机,就一定需要收集垃圾的机制,这就是Garbage Collection,对应的产品我们称为Garbage Collector。

  1. 1999年随JDK1.3.1一起来的是串行方式的Serial GC,它是第一款GC。ParNew垃圾收集器是Serial收集器的多线程版本。
  2. 2002年2月26日,Parallel GC和Concurrent Mark Sweep GC跟随JDK1.4.2一起发布。
  3. Parallel GC在JDK6之后成为HotSpot默认GC。
  4. 2012年,在JDK1.7u4版本中,G1可用。
  5. 2017年,JDK9中G1变成默认的垃圾收集器,以替代CMS。
  6. 2018年3月,JDK10中G1垃圾回收器的并行完整垃圾回收,实现并行性来改善最坏情况下的延迟。
  7. 2018年9月,JDK11发布。引入Epsilon 垃圾回收器,又被称为 "No-Op(无操作)“ 回收器。
    同时,引入ZGC:可伸缩的低延迟垃圾回收器(Experimental)
  8. 2019年3月,JDK12发布。增强G1,自动返回未用堆内存给操作系统。同时引入Shenandoah GC:低停顿时间的GC(Experimental)。
  9. 2019年9月,JDK13发布。增强ZGC,自动返回未用堆内存给操作系统。
  10. 2020年3月,JDK14发布。删除CMS垃圾回收器。扩展ZGC在macOS和Windows上的应用

2.2、7款经典的垃圾收集器及其与垃圾分代的关系

  1. 串行回收器:Serial、Serial old
  2. 并行回收器:ParNew、Parallel Scavenge、Parallel old
  3. 并发回收器:CMS、G1

相关资料:https://www.oracle.com/technetwork/java/javase/tech/memorymanagement-whitepaper-1-150020.pdf

在这里插入图片描述

  1. 新生代收集器:Serial、ParNew、Parallel Scavenge
  2. 老年代收集器:Serial old、Parallel old、CMS
  3. 整堆收集器:G1

2.3、垃圾收集器的组合关系

在这里插入图片描述

  1. 两个收集器间有连线,表明可以搭配使用。虚线表示已废除方案。
  2. Serial Old 作为 CMS 出现“Concurrent Mode Failure” 失败的后备方案。
  3. (红色虚线)由于维护和兼容性测试的成本,在 JDK8 时将Serial+CMS、ParNew+Serial Old这两个组合声明为Deprecated(JEP173),并在 JDK9 中完全取消了这些组合的支持(JEP214),即:移除。
  4. (绿色虚线)JDK14 中:弃用ParallelScavenga 和 SerialOld GC 组合(JEP 366)
  5. (青色虚线)JDK14 中:删除CMS垃圾回收器(JEP 363)
  6. GC发展阶段:Serial -> Parallel(并行)->CMS(并发)->G1 -> ZGC

2.4、查看默认的垃圾回收器

/**
 *  -XX:+PrintCommandLineFlags   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值