当前位置: 首页 > news >正文

JVM垃圾回收器介绍

  1. Serial GC:

    • 算法: 使用的是标记-清除算法。
    • 特点: 串行执行,适用于单CPU环境或较小的堆内存配置。在新生代和老年代的回收中都是单线程执行,因此在进行垃圾回收时会暂停所有应用线程(Stop-The-World)。
  2. Parallel GC (也称为吞吐量优先收集器):

    • 算法: 在新生代中使用复制算法,老年代通常使用标记-压缩算法。
    • 特点: 适用于多CPU环境,可以并行执行以提高垃圾回收速度,从而提高整体应用程序的吞吐量。在新生代回收时可以使用多个线程并行工作,但仍会在老年代回收时引起较长时间的暂停。
  3. Concurrent Mark Sweep (CMS) GC (已废弃,但在某些旧版本JDK中可用):

    • 算法: 主要使用标记-清除算法,特点是大部分工作可以在应用线程运行的同时并发进行,减少暂停时间。
    • 特点: 旨在减少垃圾回收引起的暂停时间,适用于对响应时间要求较高的服务。但可能会导致内存碎片化,并且在极端情况下可能出现内存耗尽而触发Full GC,影响性能。
  4. G1 (Garbage First) GC:

    • 算法: 结合了分区算法标记-复制的思想,新生代和老年代都在一个连续的内存空间内被划分为多个区域。
    • 特点: 设计用于大型堆内存,目标是实现可预测的暂停时间。G1通过并发标记和分区的方式工作,尝试平衡吞吐量和延迟,最终目标是替代CMS。
  5. Z Garbage Collector (ZGC):

    • 算法: 使用了染色指针技术结合标记-复制算法,实现了几乎无停顿的垃圾回收。
    • 特点: 自JDK 11引入,目标是即使在非常大的堆内存中也能保持暂停时间在10ms以内,适合对延迟敏感的应用。
    • Zero GC暂停时间目标这里的“Zero”体现在它力图使应用程序在进行垃圾回收时的暂停时间非常短,几乎不影响应用的响应时间。
    • Zapped(快速处理):“Z”隐含了快速、即时处理的意思,反映ZGC在处理垃圾回收时的高效和迅速
  6. Shenandoah GC:

    • 算法: 同样采用了标记-复制算法,并利用了类似ZGC的区域划分和并发回收策略。
    • 特点: 提供了低延迟垃圾回收能力,能在不停止应用线程的情况下进行大部分垃圾回收工作,适用于大规模且对延迟有严格要求的应用。

概念解释:

吞吐量:

具体来说,如果一个应用运行了100秒,其中98秒是在执行业务逻辑,而2秒用于垃圾回收,那么这个应用的吞吐量就是98%。

Parallel GC(也称作吞吐量优先收集器)即在牺牲一定GC停顿时间的前提下,使得应用程序能够更快地完成更多的任务。例如,在一个大数据处理或者高负载的服务器应用中,我们可能更关心在一段时间内能处理多少请求,而不是单个请求的响应时间。

吞吐量百分比可通过参数设置,默认情况下,如果不进行特殊配置,JVM的吞吐量目标是99%,这意味着目标是将99%的时间用于应用程序的执行,而只留1%的时间用于垃圾回收。

延迟:

这里特指垃圾回收引起的停顿时间,即Stop-The-World(STW)事件的持续时间。低延迟意味着在垃圾回收期间,应用程序暂停的时间很短,这对于需要即时响应的交互式应用(如在线交易系统、游戏等)来说至关重要,因为长暂停会直接影响用户体验。

平衡吞吐量和延迟:

在垃圾回收器的设计中,吞吐量和延迟往往是相互制约的。例如,为了提高吞吐量,垃圾回收器可能会采取更激进的策略,如更少的垃圾回收频率,但这可能导致每次垃圾回收时的停顿时间变长,从而增加延迟。反之,为了降低延迟,可能需要更频繁但更轻量级的垃圾回收,这又可能降低了整体的吞吐量。

G1 目标是,在确保垃圾回收停顿时间可预测和可控(低延迟)的同时,尽可能维持较高的应用程序执行效率(高吞吐量)。这意味着,G1在设计上既考虑了如何高效地回收内存,减少内存管理对应用运行的影响,也考虑到了如何让应用在面临垃圾回收时的响应更加及时和可预测。这种平衡对于现代复杂多变的应用场景尤其重要。

简单理解:如果吞吐量为98%,停顿时间2%(垃圾回收时间),怎么来停顿这2%的时间,可一次停顿,也可多次停顿,需要平衡。

应用:

jdk8: 默认使用Parallel GC

jdk9: 从Java 9开始及之后的版本,默认使用G1

相关文章:

  • 图文解析ASN.1中BER编码:结构类型、编码方法、编码实例
  • C语言TC中有⼏个画矩形函数?怎么使⽤?
  • C++中的观察者模式
  • rizhuti1.9-最新版-推荐文章缩略图
  • 【软件安装12】CloudCompare点云工具安装 Ubuntu18.04
  • Windows下对于Qt中带 / 的路径的处理
  • SpringBoot解决跨域的三种解决方案
  • 【Ardiuno】实验ESP32单片机搭建简易Web服务器功能(图文)
  • C#——值类型和引用类型的区别详情
  • 硬件存储管理
  • XSKY 在金融行业:新一代分布式核心信创存储解决方案
  • 【备忘录】配置 Docker 守护程序以使用代理服务器
  • aspose-words去水印自用资源
  • MySQL 搭建主从报错 1236
  • 土壤墒情监测站
  • [数据结构]链表的实现在PHP中
  • “大数据应用场景”之隔壁老王(连载四)
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • dva中组件的懒加载
  • Gradle 5.0 正式版发布
  • java2019面试题北京
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • leetcode46 Permutation 排列组合
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • vue-cli3搭建项目
  • 订阅Forge Viewer所有的事件
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 爬虫模拟登陆 SegmentFault
  • 微信公众号开发小记——5.python微信红包
  • 整理一些计算机基础知识!
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • (¥1011)-(一千零一拾一元整)输出
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (20050108)又读《平凡的世界》
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • (转)Scala的“=”符号简介
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .gitignore文件_Git:.gitignore
  • .NET HttpWebRequest、WebClient、HttpClient
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .Net8 Blazor 尝鲜
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • .NET应用架构设计:原则、模式与实践 目录预览
  • /proc/interrupts 和 /proc/stat 查看中断的情况
  • [ 数据结构 - C++] AVL树原理及实现
  • [17]JAVAEE-HTTP协议