首页 > 其他分享 >JVM(十五)垃圾回收器概述

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

时间:2023-07-16 15:13:06浏览次数:38  
标签:收集器 回收 GC 十五 JVM 概述 Serial Parallel 垃圾

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

标签:收集器,回收,GC,十五,JVM,概述,Serial,Parallel,垃圾
From: https://www.cnblogs.com/tod4/p/17557854.html

相关文章

  • JVM(十六)七种垃圾收集器
    JVM(十六)七种垃圾收集器0垃圾回收器的组合关系:实现相连的垃圾回收器表示可以搭配使用:SerialGC-SerialOldGCParNewGC-CMSGCParallelScavengeGC-ParallelOldGC还有一条CMSGC-SerialOldGC表示CMS出现“ConcurrentModeFailure”后的备选方案(红色虚......
  • JVM专栏-垃圾回收器
    本文以HotSpot虚拟机为例,讲述一下几种常见的垃圾回收器.新生代垃圾收集器Serial垃圾收集器(单线程)只开启一条GC线程进行垃圾回收,并且在垃圾收集过程中停止一切用户线程,即StopTheWorld。一般客户端应用所需内存较小,不会创建太多对象,而且堆内存不大,因此垃圾收集器回收......
  • JVM专栏-垃圾回收策略与算法
    程序计数器、虚拟机栈、本地方法栈随线程而生,也随线程而灭;栈帧随着方法的开始而入栈,随着方法的结束而出栈。这几个区域的内存分配和回收都具有确定性,在这几个区域内不需要过多考虑回收的问题,因为方法结束或者线程结束时,内存自然就跟随着回收了。而对于Java堆和方法区,我们只有在......
  • 《架构整洁之道》学习笔记 Part 1 概述
    本书主题介绍什么是优秀的软件架构,以提高软件架构质量介绍系统架构的各种属性与成本和生产力的关系,以采用好的设计和架构以便减少构建成本好的软件架构可以带来什么?大大节省软件项目构建与维护的人力成本每次变更:改动少,易于实施,不容易出bug用最小的成本,最大程度满足功能......
  • 吊打面试官的16000字JVM专属秘籍,又一个Java面试神器!
    前言吊打面试官的16000字JVM专属秘籍,总共包含三部分的内容,从基础到进阶带大家一步步深入理解JVM!学完就可以在简历上面直接写上精通JVM!因为篇幅限制这里只给大家做简单的一个介绍,也就是进行一个大点的梳理,每个大点下面又有很多细枝末节的技能知识需要大家好好学透,并且能够掌握吸收到......
  • 第三周 七月十五日
    今天是当家教的第三天家长还是发挥稳定中午饭菜没有出现任何问题今天算了一下饭费一个月一个学生150感觉要的太少了我们每天吃饭的成本和收的钱几乎一样但是由于是家长做饭没有要人工费所以实际收费应该更高所以又草率了麻烦家长啦今天讲物理物态变化好简单啊家长......
  • jvm基础知识
    1.jvm基础知识说明:jvm除了是压测过程中重点关注的内容,也是面试的重点1.1基础回顾java特点:跨平台内存泄漏是过程,内存溢出是结果jdk,jre,jvm的关系jdk<jre<jvm数据类型及存储基本数据类型:存储在栈内存引用数据类型:值存在堆内存,栈里存堆内存中存放的值的首地址堆栈:堆:线程......
  • JVM内存模型和类加载
    内存模型JVM内存模型主要分为堆、程序计数器、方法区、虚拟机栈和本地方法栈。堆堆中包含了字符串常量池。程序计数器记录线程执行的字节码的地址。方法区存放已被虚拟机加载的类相关信息,包括类信息、运行时常量池(存放编译生成的字面量和符号引用)。当类加载到内存后,JVM把......
  • JVM垃圾收集
    默认垃圾收集器JDK1.7和JDK1.8默认垃圾收集器都是ParallelScavenge(新生代)+ParallelOld(老年代)JDK1.9默认垃圾收集器G1查看命令:java-XX:+PrintCommandLineFlags-versionG1JDK1.7推出的垃圾收集器,特点如下:1使用多核CPU来缩短Stop-The-World停顿的时间2分代收集3基于标记-......
  • SAP IDOC 概述
    SAPIDoc是SAP系统中一种标准数据结构,它用于在SAP系统之间或SAP系统与非SAP系统之间交换数据。IDoc代表中间文档(IntermediateDocument)。这是一种自包含的数据结构,可以用于SAP系统之间或SAP系统与外部系统之间的电子数据交换。IDoc包含一组标准化的数据,可以用于通信,这些数据与发送......