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 并发回收。
- 执行阶段(老年代):
- 初始标记(STW):标记根对象,耗时短。
- 并发标记:与应用线程并行标记可达对象。
- 重新标记(STW):修正并发标记期间的变动,耗时短。
- 并发清除:与应用线程并行清除垃圾对象。
关键参数
-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 + 新生代),基于标记 - 整理算法。
执行阶段
- 初始标记(STW):标记根对象。
- 并发标记:与应用线程并行标记可达对象。
- 最终标记(STW):处理 SATB 日志(Snapshot At The Beginning,记录并发阶段新增引用)。
- 筛选回收(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 级堆内存。
执行阶段
- 初始标记(STW):标记根对象,耗时极短。
- 并发标记:与应用线程并行标记可达对象。
- 再标记(STW):处理并发标记期间的引用变动,耗时极短。
- 并发转移:移动存活对象到新 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。
执行阶段
- 初始标记(STW):标记根对象。
- 并发标记:与应用线程并行标记可达对象。
- 最终标记(STW):处理漏标的对象,耗时短。
- 并发回收:移动存活对象到新 Region,通过转发指针更新引用。
关键参数
-XX:+UseShenandoahGC # 启用 Shenandoah(OpenJDK 12+)
-XX:ShenandoahGCMode=主动/被动 # 触发模式(主动模式基于内存阈值,被动响应分配压力)
-XX:MaxGCPauseMillis=10 # 目标停顿时间(默认 10ms)
适用场景
- 大内存(8GB-2TB)且 需要 OpenJDK 原生支持 的场景(如开源项目、非商业环境)。
- 对吞吐量要求中等,但需严格控制延迟的应用(如消息中间件、实时分析系统)。
优缺点
优点 | 缺点 |
---|---|
停顿时间与 ZGC 相当 | 吞吐量低于 G1(约 90%) |
内存占用低(转发指针仅占对象头) | 商业 JDK 需授权(OpenJDK 免费) |
社区活跃,适配性强 | 调优参数较多,需深入理解机制 |
七、横向对比表格
维度 | Serial GC | Parallel GC | CMS | G1 | ZGC | Shenandoah |
---|---|---|---|---|---|---|
设计目标 | 简单单线程 | 高吞吐量 | 低延迟(老年代) | 平衡吞吐量与延迟 | 超低延迟(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 |
八、选择建议
- 小内存 / 简单场景:
- 优先选 Serial GC(单核心)或 Parallel GC(多核、需吞吐量)。
- 中等内存 / 低延迟需求:
- 选 CMS(老年代对象多)或 G1(对象分配频繁、需分代回收)。
- 大内存 / 超低延迟:
- 商业场景选 ZGC(JDK 11+,Oracle/OpenJDK);
- 开源场景选 Shenandoah(OpenJDK 12+,避免授权问题)。
- 云原生 / 弹性扩缩容:
- 优先 ZGC(支持动态堆调整和超大内存)。
九、发展趋势
- ZGC/Shenandoah 主导未来:逐步替代 G1 成为大内存场景的默认选择。
- 分代与并发结合:如 ZGC 支持分代(JDK 15+),提升年轻代回收效率。
- 硬件协同优化:利用 CPU 特性(如 AMD 的 MMU 分页)加速 GC 指针操作。
通过理解不同垃圾回收器的设计 trade-off,可根据具体业务需求(吞吐量、延迟、内存大小)选择最优方案,或通过组合参数(如 G1 的 -XX:InitiatingHeapOccupancyPercent
)进一步调优。
相关文章:
JVM 垃圾回收器
以下是对主流 JVM 垃圾回收器的详细解析,涵盖 一、Serial GC(单线程串行回收器) 二、Parallel GC(吞吐量优先回收器) 三、CMS(Concurrent Mark Sweep,低延迟回收器) 四、G1&…...
Java合并两个列表到目标列表,并且进行排序
可以通过使用addAll()方法将两个列表合并到目标列表中。以下是实现代码: 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.流式调用 阿里云百炼推出的智能体应用、工作流应用和智能体编排应用,有效解决了大模型在处理私有领域问题、获取最新信息、遵循固定流程以及自动规划复杂项目等方面的局限,…...
22. 用例依赖装饰器的实现思路和方法
22. 用例依赖装饰器的实现思路和方法 一、核心功能解析 1.1 实现目标 depend(casetest_login) # 当test_login失败时跳过当前测试 def test_order(self):pass功能特性: 前置依赖检测自动跳过失效用例异常依赖关系校验实时结果分析 二、代码逐行解析 2.1 自定义…...

支持向量存储:PostgresSQL及pgvector扩展详细安装步骤!老工程接入RAG功能必备!
之前文章和大家分享过,将会出一篇专栏(从电脑装ubuntu系统,到安装ubuntu的常用基础软件:jdk、python、node、nginx、maven、supervisor、minio、docker、git、mysql、redis、postgresql、mq、ollama等),目前…...
【部署】如何离线环境创建docker容器执行python命令行程序
回到目录 【部署】如何离线环境创建docker容器执行python命令行程序 本文以 dify_import项目为例,讲解如何在离线服务器上,搭建docker容器环境,执行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 用来配置文件和代码模板,即…...
【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组件。 基础配置如下:(暂时勾选Looping实时可以看生成效果,后面反选即可&am…...

第十节第六部分:常见API:DateTimeFormatter、Period、Duration
DateTimeFormatter类常用方法 Period类常用方法 Duration类常用方法 总结 代码: 代码一:DateTimeFormatter类常用方法 package com.itheima.jdk8_time;import java.time.LocalDateTime; import java.time.format.DateTimeFormatter;public class DateT…...

如何在VSCode中更换默认浏览器:完整指南
引言 作为前端开发者,我们经常需要在VSCode中快速预览HTML文件。默认情况下,VSCode会使用系统默认浏览器打开文件,但有时我们可能需要切换到其他浏览器进行测试。本文将详细介绍如何在VSCode中更换默认浏览器。 方法一:使用VSCo…...
B2160 病人排队
题目描述 编写一个程序,将登记的病人按照以下原则排出看病的先后顺序: 老年人(年龄 ≥60 岁)比非老年人优先看病。老年人按年龄从大到小的顺序看病,年龄相同的按登记的先后顺序排序。非老年人按登记的先后顺序看病。输入格式 第 1 行,输入一个小于 100 的正整数,表示病人…...

【机器人】复现 3D-Mem 具身探索和推理 | 3D场景记忆 CVPR 2025
3D-Mem 是用于具体探索和推理的3D场景记忆,来自CVPR 2025. 本文分享3D-Mem复现和模型推理的过程~ 下面是一个推理和选择识别的结果: 看一下机器人探索的效果: 下面是真实环境下,官方跑的demo,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 过渡
本系列可作为前端学习系列的笔记,代码的运行环境是在HBuilder中,小编会将代码复制下来,大家复制下来就可以练习了,方便大家学习。 HTML系列文章 已经收录在前端专栏,有需要的宝宝们可以点击前端专栏查看! 点…...
TTS:VITS-fast-fine-tuning 快速微调 VITS
1,项目概述 VITS是一种语音合成的方法,是一个完全端到端的TTS 模型,它使用预先训练好的语音编码器将文本转化为语音,并且是直接从文本到语音波形的转换,无需额外的中间步骤或特征提取。 VITS的工作流程为:…...

从虚拟仿真到行业实训再到具身智能--华清远见嵌入式物联网人工智能全链路教学方案
2025年5月23-25日,第63届中国高等教育博览会(高博会)将在长春中铁东北亚国际博览中心举办。作为国内高等教育领域规模大、影响力广的综合性展会,高博会始终聚焦教育科技前沿,吸引全国高校管理者、一线教师、教育科技企…...

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

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

UE 材质几个输出向量节点
PixelNormalWS...
【modelscope/huggingface 通过colab将huggingface 模型/数据集/空间转移到 modelscope并下载】
1. 准备 注册一个modelscope账号(国内的)拿到对应的访问令牌SDK/API令牌注册一个google账号, 登录colab 2. 开始干! 打开一个ipynb 安装依赖包 !pip install -qqq modelscope huggingface-hub -U选择安装git lfs !curl -s https://packag…...

告别静态UI!Guineration用AI打造用户专属动态界面
摘 要 作为智能原生操作系统 DingOS 的核心技术之一,Guineration 生成式 UI 体系深刻践行了 DingOS“服务定义软件”的核心理念。DingOS 以“一切皆服务、服务按需而取、按用付费”为设计宗旨,致力于通过智能原生能力与粒子服务架构,实现资源…...

第六届电子通讯与人工智能国际学术会议(ICECAI 2025)
在数字化浪潮中,电子通讯与人工智能的融合正悄然重塑世界的运行逻辑。技术基础的共生关系是这场变革的核心——电子通讯如同“信息高速公路”,通过5G等高速传输技术,将海量数据实时输送至AI系统,使其能够像人类神经系统般快速响应…...
【C/C++】C++并发编程:std::async与std::thread深度对比
文章目录 C并发编程:std::async与std::thread深度对比1 核心设计目的以及区别2 详细对比分析3 代码对比示例4 适用场景建议5 总结 C并发编程:std::async与std::thread深度对比 在 C 中,std::async 和 std::thread 都是用于并发编程的工具&am…...
每日算法刷题Day11 5.20:leetcode不定长滑动窗口求最长/最大6道题,结束不定长滑动窗口求最长/最大,用时1h20min
6. 1695.删除子数组的最大得分(中等) 1695. 删除子数组的最大得分 - 力扣(LeetCode) 思想 1.给你一个正整数数组 nums ,请你从中删除一个含有 若干不同元素 的子数组**。**删除子数组的 得分 就是子数组各元素之 和 。 返回 只删除一个 子…...
STL中的Vector(顺序表)
vector容器的基本用法: template<class T> class vector { T* _a; size_t size; size_t capacity; } 尾插和遍历: 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 的动态特性:Objective-C 是一门动态语言,很多工作都是在运行时而非编译时决定的消息传递机制:方法调用实际上是发送消息 objc_msgSend(receiver, selector, ...)方法决议机制:动态方法解析、…...

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

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