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

JVM 垃圾回收器

以下是对主流 JVM 垃圾回收器的详细解析,涵盖 

一、Serial GC(单线程串行回收器)

二、Parallel GC(吞吐量优先回收器)

三、CMS(Concurrent Mark Sweep,低延迟回收器)

四、G1(Garbage-First,区域分代回收器)

五、ZGC(超低延迟回收器)

六、Shenandoah(OpenJDK 低延迟回收器)

 的核心机制、适用场景及横向对比,帮助理解不同垃圾回收器的设计哲学与性能特点。

一、Serial GC(单线程串行回收器)

核心机制
  • 算法
    • 新生代:复制算法(Copying Algorithm),将存活对象从 Eden/Survivor 复制到另一块 Survivor。
    • 老年代:标记 - 整理算法(Mark-Compact),标记存活对象后压缩内存空间。
  • 执行特点
    • 单线程:GC 时需 Stop The World(STW),暂停所有应用线程,全程由一条 GC 线程完成。
    • 简单高效:无线程切换开销,适合内存较小的环境。
关键参数
-XX:+UseSerialGC        # 启用 Serial GC(默认用于 Client 模式)
-XX:SurvivorRatio=8     # Eden:Survivor 比例(默认 8:1)
适用场景
  • 嵌入式设备或 单核心服务器(如小型桌面应用)。
  • 内存 < 1GB 的场景,STW 时间可控。
优缺点
优点缺点
简单可靠,无额外内存开销单线程导致 STW 时间较长
适合内存小的场景无法利用多核 CPU 优势

二、Parallel GC(吞吐量优先回收器)

核心机制
  • 算法
    • 新生代:多线程复制算法,并行执行垃圾回收。
    • 老年代:多线程标记 - 整理算法(JDK 8 前为 Serial Old,JDK 9+ 为 Parallel Old)。
  • 执行特点
    • 多线程并行:通过 -XX:ParallelGCThreads 设置线程数,利用多核 CPU 缩短 STW 时间。
    • 目标吞吐量:通过 -XX:GCTimeRatio 控制 GC 时间占比(默认 99%,即 GC 时间 ≤ 1%)。
关键参数
-XX:+UseParallelGC      # 启用 Parallel GC(默认用于 Server 模式)
-XX:MaxGCPauseMillis=100 # 目标最大停顿时间(毫秒,动态调整堆大小)
-XX:GCTimeRatio=99      # 吞吐量目标(1/(1+N),N=99 即吞吐量 99%)
适用场景
  • 后台计算任务(如大数据处理、科学计算),优先保证吞吐量。
  • 堆内存中等大小(如 4-8GB),允许较短 STW 但需高持续处理能力。
优缺点
优点缺点
多线程提升吞吐量停顿时间仍随堆增大而增长
自动调优(自适应策略)无法满足低延迟需求

三、CMS(Concurrent Mark Sweep,低延迟回收器)

核心机制
  • 算法
    • 标记 - 清除(Mark-Sweep):老年代使用该算法,避免整理内存的 STW 开销。
    • 分代设计:新生代用 Parallel Scavenge(多线程复制),老年代用 CMS 并发回收。
  • 执行阶段(老年代):
    1. 初始标记(STW):标记根对象,耗时短。
    2. 并发标记:与应用线程并行标记可达对象。
    3. 重新标记(STW):修正并发标记期间的变动,耗时短。
    4. 并发清除:与应用线程并行清除垃圾对象。
关键参数
-XX:+UseConcMarkSweepGC  # 启用 CMS GC
-XX:CMSInitiatingOccupancyFraction=70 # 老年代占用 70% 时触发 GC
-XX:+CMSParallelRemarkEnabled # 启用并行重新标记(减少 STW 时间)
适用场景
  • 交互式应用(如 Web 服务器、前端服务),需降低 STW 对用户体验的影响。
  • 堆内存较大(如 8-16GB),但对象存活率较高(老年代占比大)。
优缺点
优点缺点
老年代并发回收,STW 时间短标记 - 清除导致内存碎片
适合低延迟场景并发阶段占用 CPU 资源
分代设计提升回收效率可能触发 "Concurrent Mode Failure"(回收速度慢于分配速度)

四、G1(Garbage-First,区域分代回收器)

核心机制
  • 分区(Region)设计
    • 将堆划分为大小相等的 Region(如 2MB-32MB),每个 Region 可动态扮演 Eden、Survivor、Old 或 Humongous(大对象)。
    • 优先回收价值高的区域:通过记录每个 Region 的垃圾占比,优先处理回收收益最大的区域(Garbage-First 得名)。
  • 算法
    • 新生代:多线程复制算法,回收 Eden/Survivor 区域。
    • 老年代:并发标记 + 混合回收(部分 Old Region + 新生代),基于标记 - 整理算法。
执行阶段
  1. 初始标记(STW):标记根对象。
  2. 并发标记:与应用线程并行标记可达对象。
  3. 最终标记(STW):处理 SATB 日志(Snapshot At The Beginning,记录并发阶段新增引用)。
  4. 筛选回收(STW):计算各 Region 回收收益,选择部分 Old Region 与新生代混合回收。
关键参数
-XX:+UseG1GC            # 启用 G1 GC
-XX:G1HeapRegionSize=4m # 设置 Region 大小(自动推算默认值)
-XX:MaxGCPauseMillis=200 # 目标最大停顿时间(默认 200ms)
-XX:G1MixedGCCountTarget=8 # 混合回收时最大 Region 数
适用场景
  • 大内存(8GB+) 且 需要兼顾吞吐量与低延迟 的场景(如微服务、中间件)。
  • 对象分配频率高(如新生代大对象多),或存在大量中等大小对象(避免进入 Humongous Region)。
优缺点
优点缺点
分区设计避免内存碎片内存占用高(每个 Region 需元数据)
可预测的停顿时间并发标记阶段耗 CPU 资源
混合回收应对老年代回收调优复杂度高于 CMS/Parallel

五、ZGC(超低延迟回收器)

核心机制
  • 着色指针(Colored Pointers)
    • 将对象引用的低 4 位用于存储 GC 状态(如标记位、重映射状态),无需修改对象头,减少内存访问开销。
  • 读屏障(Load Barrier)
    • 在读取对象引用时动态修正指针(如对象被移动到新 Region,通过读屏障获取新地址)。
  • 并发标记 - 整理
    • 全程几乎无 STW(仅初始标记和再标记有极短停顿,通常 <1ms),支持 TB 级堆内存。
执行阶段
  1. 初始标记(STW):标记根对象,耗时极短。
  2. 并发标记:与应用线程并行标记可达对象。
  3. 再标记(STW):处理并发标记期间的引用变动,耗时极短。
  4. 并发转移:移动存活对象到新 Region,通过读屏障修正所有引用。
关键参数
-XX:+UseZGC              # 启用 ZGC(JDK 11+)
-XX:ZHeapMaxSize=8t      # 最大堆内存(支持 TB 级)
-XX:ZCollectionInterval=1000 # 强制 GC 间隔(毫秒,避免碎片累积)
适用场景
  • 超大堆内存(16GB-8TB)且 对延迟敏感 的场景(如金融交易、实时数据处理)。
  • 云原生环境(如 Kubernetes 弹性扩缩容),需快速启动和低停顿。
优缺点
优点缺点
停顿时间 <10ms,几乎无感知吞吐量略低于 G1(约 95%)
支持动态堆大小调整仅 JDK 11+ 可用,需谨慎适配
分代设计(JDK 15+)提升年轻代回收效率

六、Shenandoah(OpenJDK 低延迟回收器)

核心机制
  • 转发指针(Forwarding Pointer)
    • 在对象头中添加指针,指向对象的新地址(移动后通过该指针修正引用)。
  • 布鲁姆过滤器(Bloom Filter)
    • 快速判断对象是否已被移动,减少无效的指针扫描,提升并发性能。
  • 并发标记 - 复制
    • 与 ZGC 类似,全程并发执行,仅初始标记和最终标记有短暂 STW。
执行阶段
  1. 初始标记(STW):标记根对象。
  2. 并发标记:与应用线程并行标记可达对象。
  3. 最终标记(STW):处理漏标的对象,耗时短。
  4. 并发回收:移动存活对象到新 Region,通过转发指针更新引用。
关键参数
-XX:+UseShenandoahGC     # 启用 Shenandoah(OpenJDK 12+)
-XX:ShenandoahGCMode=主动/被动 # 触发模式(主动模式基于内存阈值,被动响应分配压力)
-XX:MaxGCPauseMillis=10  # 目标停顿时间(默认 10ms)
适用场景
  • 大内存(8GB-2TB)且 需要 OpenJDK 原生支持 的场景(如开源项目、非商业环境)。
  • 对吞吐量要求中等,但需严格控制延迟的应用(如消息中间件、实时分析系统)。
优缺点
优点缺点
停顿时间与 ZGC 相当吞吐量低于 G1(约 90%)
内存占用低(转发指针仅占对象头)商业 JDK 需授权(OpenJDK 免费)
社区活跃,适配性强调优参数较多,需深入理解机制

七、横向对比表格

维度Serial GCParallel GCCMSG1ZGCShenandoah
设计目标简单单线程高吞吐量低延迟(老年代)平衡吞吐量与延迟超低延迟(TB 级)超低延迟(OpenJDK)
堆大小推荐小(<1GB)中等(4-8GB)中大(8-16GB)大(8GB+)超大(16GB+)大(8GB-2TB)
STW 时间中等短(老年代并发)可控(<500ms)极短(<10ms)极短(<10ms)
算法核心复制 + 标记整理并行复制 + 整理并发标记 - 清除分区 + 混合回收着色指针 + 并发整理转发指针 + 并发复制
适用场景嵌入式 / 单核心后台计算Web 服务微服务 / 中间件金融 / 实时数据开源 / OpenJDK 环境
JDK 版本全版本全版本JDK 1.4+JDK 7+JDK 11+OpenJDK 12+
典型参数-XX:+UseSerialGC-XX:+UseParallelGC-XX:+UseConcMarkSweepGC-XX:+UseG1GC-XX:+UseZGC-XX:+UseShenandoahGC

八、选择建议

  1. 小内存 / 简单场景
    • 优先选 Serial GC(单核心)或 Parallel GC(多核、需吞吐量)。
  2. 中等内存 / 低延迟需求
    • 选 CMS(老年代对象多)或 G1(对象分配频繁、需分代回收)。
  3. 大内存 / 超低延迟
    • 商业场景选 ZGC(JDK 11+,Oracle/OpenJDK);
    • 开源场景选 Shenandoah(OpenJDK 12+,避免授权问题)。
  4. 云原生 / 弹性扩缩容
    • 优先 ZGC(支持动态堆调整和超大内存)。

九、发展趋势

  • ZGC/Shenandoah 主导未来:逐步替代 G1 成为大内存场景的默认选择。
  • 分代与并发结合:如 ZGC 支持分代(JDK 15+),提升年轻代回收效率。
  • 硬件协同优化:利用 CPU 特性(如 AMD 的 MMU 分页)加速 GC 指针操作。

通过理解不同垃圾回收器的设计 trade-off,可根据具体业务需求(吞吐量、延迟、内存大小)选择最优方案,或通过组合参数(如 G1 的 -XX:InitiatingHeapOccupancyPercent)进一步调优。

相关文章:

JVM 垃圾回收器

以下是对主流 JVM 垃圾回收器的详细解析&#xff0c;涵盖 一、Serial GC&#xff08;单线程串行回收器&#xff09; 二、Parallel GC&#xff08;吞吐量优先回收器&#xff09; 三、CMS&#xff08;Concurrent Mark Sweep&#xff0c;低延迟回收器&#xff09; 四、G1&…...

Java合并两个列表到目标列表,并且进行排序

可以通过使用addAll()方法将两个列表合并到目标列表中。以下是实现代码&#xff1a; java 复制 下载 List<LedgerRecord> rkRecordList warehouseMapper.selectLedgerRkRecordByMaterialNo(materialNo); List<LedgerRecord> ckRecordList warehouseMapper.se…...

Spring AI Alibaba集成阿里云百炼大模型应用

文章目录 1.准备工作2.引入maven依赖3.application.yml4.调用4.1.非流式调用4.2.流式调用 阿里云百炼推出的智能体应用、工作流应用和智能体编排应用&#xff0c;有效解决了大模型在处理私有领域问题、获取最新信息、遵循固定流程以及自动规划复杂项目等方面的局限&#xff0c;…...

22. 用例依赖装饰器的实现思路和方法

22. 用例依赖装饰器的实现思路和方法 一、核心功能解析 1.1 实现目标 depend(casetest_login) # 当test_login失败时跳过当前测试 def test_order(self):pass功能特性&#xff1a; 前置依赖检测自动跳过失效用例异常依赖关系校验实时结果分析 二、代码逐行解析 2.1 自定义…...

支持向量存储:PostgresSQL及pgvector扩展详细安装步骤!老工程接入RAG功能必备!

之前文章和大家分享过&#xff0c;将会出一篇专栏&#xff08;从电脑装ubuntu系统&#xff0c;到安装ubuntu的常用基础软件&#xff1a;jdk、python、node、nginx、maven、supervisor、minio、docker、git、mysql、redis、postgresql、mq、ollama等&#xff09;&#xff0c;目前…...

【部署】如何离线环境创建docker容器执行python命令行程序

回到目录 【部署】如何离线环境创建docker容器执行python命令行程序 本文以 dify_import项目为例&#xff0c;讲解如何在离线服务器上&#xff0c;搭建docker容器环境&#xff0c;执行python命令行程序 1. 一台有互联网的服务器(ubuntu24.04) 1.1. 拉取一个ubuntu的docker镜…...

idea常用配置 properties中文输出乱码

propertis配置中文乱码 源码和编译后的都是中文 程序输入效果 idea配置3处 程序输出效果 自定义注释模板 IDEA 中有以下两种配置模板。 File and Code Templates Live Templates File and Code Templates File and Code Templates 用来配置文件和代码模板&#xff0c;即…...

【Bluedroid】蓝牙 HID Host connect全流程源码解析

蓝牙 HID(Human Interface Device,人机接口设备)是智能设备与外设(如键盘、鼠标、游戏手柄)交互的核心协议。本文围绕Android蓝牙 HID 主机模块的连接流程,从上层应用发起连接请求开始,逐层解析协议栈内部的状态检查、设备管理、SDP 服务发现、L2CAP 通道建立等关键步骤…...

day1 大模型学习 Qwen系列学习

Qwen 模型学习笔记:RM、SFT 与 RLHF 技术解析 一、Qwen 模型概述 Qwen 是阿里巴巴开源的大型语言模型系列,旨在实现通用人工智能(AGI)。其架构包括基础语言模型(如 Qwen-7B、Qwen-14B、Qwen-72B)和经过后训练的对话模型(如 Qwen-Chat)。后训练主要通过 SFT 和 RLHF 技…...

Unity3D仿星露谷物语开发47之砍树时落叶特效

1、目标 当橡树被砍伐时的落叶粒子效果。 2、创建粒子物体 Hierarchy -> PersistentScene下创建新物体命名为DeciduousLeavesFalling。 添加Particle System组件。 基础配置如下&#xff1a;&#xff08;暂时勾选Looping实时可以看生成效果&#xff0c;后面反选即可&am…...

第十节第六部分:常见API:DateTimeFormatter、Period、Duration

DateTimeFormatter类常用方法 Period类常用方法 Duration类常用方法 总结 代码&#xff1a; 代码一&#xff1a;DateTimeFormatter类常用方法 package com.itheima.jdk8_time;import java.time.LocalDateTime; import java.time.format.DateTimeFormatter;public class DateT…...

如何在VSCode中更换默认浏览器:完整指南

引言 作为前端开发者&#xff0c;我们经常需要在VSCode中快速预览HTML文件。默认情况下&#xff0c;VSCode会使用系统默认浏览器打开文件&#xff0c;但有时我们可能需要切换到其他浏览器进行测试。本文将详细介绍如何在VSCode中更换默认浏览器。 方法一&#xff1a;使用VSCo…...

B2160 病人排队

题目描述 编写一个程序,将登记的病人按照以下原则排出看病的先后顺序: 老年人(年龄 ≥60 岁)比非老年人优先看病。老年人按年龄从大到小的顺序看病,年龄相同的按登记的先后顺序排序。非老年人按登记的先后顺序看病。输入格式 第 1 行,输入一个小于 100 的正整数,表示病人…...

【机器人】复现 3D-Mem 具身探索和推理 | 3D场景记忆 CVPR 2025

3D-Mem 是用于具体探索和推理的3D场景记忆&#xff0c;来自CVPR 2025. 本文分享3D-Mem复现和模型推理的过程&#xff5e; 下面是一个推理和选择识别的结果&#xff1a; 看一下机器人探索的效果&#xff1a; 下面是真实环境下&#xff0c;官方跑的demo&#xff0c;3D-Mem无需训…...

鸿蒙进阶——CMakelist、GN语法简介及三方库通用移植指南

文章大纲 引言一、GN常用的内置变量二、GN常用的内置函数三、CMake 重要语法1、生成动态库2、生成静态库3、生成OBJECT 库4、重要的函数和模块4.1、add_definitions4.2、execute_process4.3、add_dependencies4.4、install4.5、FetchContent 四、GN 重要语法1、编译Target2、预…...

CSS-5.1 Transition 过渡

本系列可作为前端学习系列的笔记&#xff0c;代码的运行环境是在HBuilder中&#xff0c;小编会将代码复制下来&#xff0c;大家复制下来就可以练习了&#xff0c;方便大家学习。 HTML系列文章 已经收录在前端专栏&#xff0c;有需要的宝宝们可以点击前端专栏查看&#xff01; 点…...

TTS:VITS-fast-fine-tuning 快速微调 VITS

1&#xff0c;项目概述 VITS是一种语音合成的方法&#xff0c;是一个完全端到端的TTS 模型&#xff0c;它使用预先训练好的语音编码器将文本转化为语音&#xff0c;并且是直接从文本到语音波形的转换&#xff0c;无需额外的中间步骤或特征提取。 VITS的工作流程为&#xff1a;…...

从虚拟仿真到行业实训再到具身智能--华清远见嵌入式物联网人工智能全链路教学方案

2025年5月23-25日&#xff0c;第63届中国高等教育博览会&#xff08;高博会&#xff09;将在长春中铁东北亚国际博览中心举办。作为国内高等教育领域规模大、影响力广的综合性展会&#xff0c;高博会始终聚焦教育科技前沿&#xff0c;吸引全国高校管理者、一线教师、教育科技企…...

告别手动绘图!2分钟用 AI 生成波士顿矩阵

波士顿矩阵作为经典工具&#xff0c;始终是企业定位产品组合、制定竞争策略的核心方法论。然而&#xff0c;传统手动绘制矩阵的方式&#xff0c;往往面临数据处理繁琐、图表调整耗时、团队协作低效等痛点。 随着AI技术的发展&#xff0c;这一现状正在被彻底改变。boardmix博思白…...

GraphPad Prism工作表的管理

《2025新书现货 GraphPad Prism图表可视化与统计数据分析&#xff08;视频教学版&#xff09;雍杨 康巧昆 清华大学出版社教材书籍 9787302686460 GraphPadPrism图表可视化 无规格》【摘要 书评 试读】- 京东图书 GraphPad Prism统计数据分析_夏天又到了的博客-CSDN博客 工作…...

UE 材质几个输出向量节点

PixelNormalWS...

【modelscope/huggingface 通过colab将huggingface 模型/数据集/空间转移到 modelscope并下载】

1. 准备 注册一个modelscope账号&#xff08;国内的&#xff09;拿到对应的访问令牌SDK/API令牌注册一个google账号&#xff0c; 登录colab 2. 开始干! 打开一个ipynb 安装依赖包 !pip install -qqq modelscope huggingface-hub -U选择安装git lfs !curl -s https://packag…...

告别静态UI!Guineration用AI打造用户专属动态界面

摘 要 作为智能原生操作系统 DingOS 的核心技术之一&#xff0c;Guineration 生成式 UI 体系深刻践行了 DingOS“服务定义软件”的核心理念。DingOS 以“一切皆服务、服务按需而取、按用付费”为设计宗旨&#xff0c;致力于通过智能原生能力与粒子服务架构&#xff0c;实现资源…...

第六届电子通讯与人工智能国际学术会议(ICECAI 2025)

在数字化浪潮中&#xff0c;电子通讯与人工智能的融合正悄然重塑世界的运行逻辑。技术基础的共生关系是这场变革的核心——电子通讯如同“信息高速公路”&#xff0c;通过5G等高速传输技术&#xff0c;将海量数据实时输送至AI系统&#xff0c;使其能够像人类神经系统般快速响应…...

【C/C++】C++并发编程:std::async与std::thread深度对比

文章目录 C并发编程&#xff1a;std::async与std::thread深度对比1 核心设计目的以及区别2 详细对比分析3 代码对比示例4 适用场景建议5 总结 C并发编程&#xff1a;std::async与std::thread深度对比 在 C 中&#xff0c;std::async 和 std::thread 都是用于并发编程的工具&am…...

每日算法刷题Day11 5.20:leetcode不定长滑动窗口求最长/最大6道题,结束不定长滑动窗口求最长/最大,用时1h20min

6. 1695.删除子数组的最大得分(中等) 1695. 删除子数组的最大得分 - 力扣&#xff08;LeetCode&#xff09; 思想 1.给你一个正整数数组 nums &#xff0c;请你从中删除一个含有 若干不同元素 的子数组**。**删除子数组的 得分 就是子数组各元素之 和 。 返回 只删除一个 子…...

STL中的Vector(顺序表)

vector容器的基本用法&#xff1a; template<class T> class vector { T* _a; size_t size; size_t capacity; } 尾插和遍历&#xff1a; vector<int> v; v.push_back(1); v.push_back(2); v.push_back(3);//遍历 for(int i0;i<v.size();i) {cout<<…...

iOS Runtime与RunLoop的对比和使用

Runtime 机制 核心概念 Objective-C 的动态特性&#xff1a;Objective-C 是一门动态语言&#xff0c;很多工作都是在运行时而非编译时决定的消息传递机制&#xff1a;方法调用实际上是发送消息 objc_msgSend(receiver, selector, ...)方法决议机制&#xff1a;动态方法解析、…...

解决vscode在任务栏显示白色图标

长久不用&#xff0c;不知道怎么着就显示成白色图标&#xff0c;虽然不影响使用&#xff0c;但是看起来不爽 问了豆包&#xff0c;给了个解决方法&#xff1a; 1、打开隐藏文件&#xff0c; 由于图标缓存文件是隐藏文件&#xff0c;首先点击资源管理器中的 “查看” 菜单&am…...

架构思维:构建高并发扣减服务_分布式无主架构

文章目录 Pre无主架构的任务简单实现分布式无主架构 设计和实现扣减中的返还什么是扣减的返还返还实现原则原则一&#xff1a;扣减完成才能返还原则二&#xff1a;一次扣减可以多次返还原则三&#xff1a;返还的总数量要小于等于原始扣减的数量原则四&#xff1a;返还要保证幂等…...