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

JVM的垃圾回收器都有哪些?

在 Java 虚拟机(JVM)中,不同的垃圾回收器采用不同的算法和策略,以满足不同应用场景的性能需求。以下为你详细介绍常见的 JVM 垃圾回收器:

新生代垃圾回收器

1. Serial 收集器
  • 特点:单线程的垃圾回收器,在进行垃圾回收时,必须暂停其他所有的工作线程(Stop The World,简称 STW),直到垃圾回收完成。
  • 适用场景:适用于客户端模式下的小型应用程序,因为它的实现简单,没有线程交互的开销,在单 CPU 环境下有较好的性能。
  • 启用参数-XX:+UseSerialGC
2. ParNew 收集器
  • 特点:Serial 收集器的多线程版本,同样会产生 STW 现象,但它可以利用多个 CPU 核心并行进行垃圾回收,从而提高垃圾回收的效率。
  • 适用场景:常与老年代的 CMS 收集器配合使用,在注重响应时间的服务器应用中较为常见。
  • 启用参数-XX:+UseParNewGC
3. Parallel Scavenge 收集器
  • 特点:也是一款多线程的新生代收集器,它的目标是达到一个可控制的吞吐量(吞吐量 = 运行用户代码时间 /(运行用户代码时间 + 垃圾收集时间))。它可以自动调节新生代的大小、Eden 区和 Survivor 区的比例等参数,以达到预设的吞吐量目标。
  • 适用场景:适用于那些对吞吐量要求较高、对停顿时间要求不是特别苛刻的应用,如后台运算等。
  • 启用参数-XX:+UseParallelGC

老年代垃圾回收器

1. Serial Old 收集器
  • 特点:Serial 收集器的老年代版本,同样是单线程收集器,使用标记 - 整理算法。
  • 适用场景:主要用于客户端模式,或者在 Server 模式下作为 CMS 收集器发生失败时的后备预案。
  • 启用参数-XX:+UseSerialGC(同时会启用 Serial 作为新生代收集器)
2. Parallel Old 收集器
  • 特点:Parallel Scavenge 收集器的老年代版本,多线程收集器,使用标记 - 整理算法。它的出现是为了在注重吞吐量的场景下,与 Parallel Scavenge 收集器配合使用,进一步提高系统的整体吞吐量。
  • 适用场景:与 Parallel Scavenge 收集器搭配,适用于对吞吐量要求较高的服务器应用。
  • 启用参数-XX:+UseParallelOldGC
3. CMS(Concurrent Mark Sweep)收集器
  • 特点:以获取最短回收停顿时间为目标的收集器,采用标记 - 清除算法。它的整个过程分为初始标记、并发标记、重新标记和并发清除四个阶段,其中初始标记和重新标记阶段会产生 STW,但停顿时间相对较短,而并发标记和并发清除阶段可以与用户线程并发执行。
  • 适用场景:适用于对响应时间要求较高的应用,如 Web 应用等。
  • 启用参数-XX:+UseConcMarkSweepGC

全堆垃圾回收器

1. G1(Garbage - First)收集器
  • 特点:面向服务端应用的垃圾回收器,将堆内存划分为多个大小相等的 Region,它可以预测垃圾回收的停顿时间,并根据用户指定的停顿时间目标,优先回收价值最大的 Region。G1 收集器采用标记 - 整理和复制算法,整体上看是标记 - 整理算法,局部(Region 之间)是复制算法,不会产生内存碎片。
  • 适用场景:适用于大内存、多 CPU 的服务器应用,能较好地满足对响应时间和吞吐量的综合要求。
  • 启用参数-XX:+UseG1GC
2. ZGC(Z Garbage Collector)
  • 特点:可伸缩的低延迟垃圾回收器,它的停顿时间几乎可以忽略不计,最大停顿时间不超过 10 毫秒。ZGC 采用染色指针和读屏障技术,能够在并发的情况下完成对象的标记、移动等操作。
  • 适用场景:适用于对低延迟要求极高的应用,如大型在线游戏、金融交易系统等。
  • 启用参数-XX:+UseZGC
3. Shenandoah 收集器
  • 特点:与 ZGC 类似,也是一款追求极低延迟的垃圾回收器,它通过与用户线程并发执行大部分的垃圾回收工作,减少了 STW 时间。
  • 适用场景:适用于对延迟非常敏感的应用场景。
  • 启用参数-XX:+UseShenandoahGC

新生代往往和老年代回收器是配合使用一般搭配如下:

  • Serial 和 Serial Old
  • ParNew 和CMS
  • Parallel Scavenge 和 Parallel Old

G1、ZGC和Shenandoah则都是不区分

不同的垃圾回收器有不同的特点和适用场景,在实际应用中,需要根据应用的内存使用情况、性能要求等因素选择合适的垃圾回收器。


http://www.kler.cn/a/582716.html

相关文章:

  • Vite打包原理: Tree-shaking在Vue3项目中的实际效果
  • JVM垃圾收集器合集
  • 查看linux系统重启的日志
  • 利用8个参数定义一个汽轮机,然后根据这8个参数生成汽轮机性能试验时的测点清单-pycharm-源代码(适用所有类型汽轮机)
  • 数智读书笔记系列016 从《理解和改变世界》探寻AI时代的知识与智能密码
  • 邮箱验证:外贸邮件营销中的关键策略
  • 在终端中用code命令打开vscode并加载当前目录了
  • 部署项目至服务器:响应时间太长,无法访问此页面?
  • AGI大模型(2):GPT:Generative Pre-trained Transformer
  • 【C++ STL】 容器详解:pair 学习
  • electron + vue3 + vite 渲染进程与渲染进程之间的消息端口通信
  • 力扣:3305.元音辅音字符串计数
  • 根据 GPU 型号安装指定 CUDA 版本的详细步骤(附有CUDA版本对应torch版本的表格)
  • 神经网络探秘:原理、架构与实战案例
  • 智能对话小程序功能优化day1-登录鉴权
  • 第2章、WPF窗体及其属性
  • 【AI大模型】LLM训练deepseek如何识别视频
  • VUE3的数据绑定,计算属性,监听
  • 【亲测有效】Electron打包的应用不支持mac os 10.11问题,Electron在mac os 10.11无法安装问题
  • 面试基础--高并发高可用架构深度实践:降级熔断(Hystrix vs Sentinel)核心原理与源码解析