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

一文搞懂:JVM垃圾回收(GC)算法与调优实战——从分代回收到G1、ZGC

写在前面我们很多Java程序员都有这样的经历工作三五年写业务代码驾轻就熟各种框架用得飞起但突然有一天线上系统OOM了看不懂日志、不知如何排查、重启解决一切事后却根本不知道为什么。还有更扎心的一幕跳槽面试面试官问“你做过JVM调优吗讲讲你们的Full GC是怎么排查的”其实心里清楚自己连JVM参数怎么配都不确定更别说做过调优了。其实JVM知识点一直被很多人刻板地认为是“面试八股文”八股到不需要过多地深入仅需在面试前突击背一下就能过关斩将的内容。然而据腾讯开发者社区的调研数据显示超过78%的Java开发者对JVM的理解停留在“知道有这个东西”的层面真正能熟练进行JVM调优的只有不到15%。但我要说一句JVM真的不是八股文。在日常开发中你也许从不主动了解JVM但JVM的每个动作都在深刻影响你的系统。当线上系统运行得好好的突然卡死崩溃日志里只吐出冰冷的OutOfMemoryError而你束手无策的时候你就能深刻体会到——不懂JVM你失去的是解决问题的底层能力。这篇笔记我们从“为什么大厂必考JVM”这个问题切入沿着垃圾回收技术的发展脉络系统梳理分代回收、GC算法、主流垃圾收集器的演进最后落地到真实的线上调优实战帮你把这块关键拼图牢牢掌握。1️⃣ 引言为什么Java开发者必须搞懂JVM按说Java的初衷是让开发者“一次编写到处运行”同时屏蔽繁琐的内存管理细节。那为什么大厂面试还要深究这些底层原理学习JVM的价值具体体现在四个层面。① 面试刚需JVM是高频必考点无论是BATJ等大厂还是快速发展的独角兽企业JVM几乎都是Java面试中必考的内容。但面试官真正考察的不是死记硬背而是能不能将JVM原理映射到实际业务场景有没有真实排查问题的能力。比如“聊聊你做过的JVM调优经验”这种开放式问题很多人直接哑口无言这就成了区分初中级工程师的分水岭。② 线上生存技能不懂JVM你不配当“救火队员”线上系统发生OOM、CPU飙升、接口延迟抖动时如果你连基本排查工具都看不懂只能靠重启“治标不治本”在团队里就会很被动。掌握标准的JVM工具链jstat、jmap等和调优方法论才能快速定位根因。③ 架构设计基石高并发系统的决胜密码大型系统架构设计本质上是在对包括JVM在内的各项资源进行精细化调配。阿里双11能将GC停顿控制在极低水平依靠的就是对G1回收器的精准调优。④ 技术深度修炼从“码农”到“工程师”的分水岭理解即时编译器、垃圾回收算法和类加载机制能帮你写出更高效的代码甚至实现热部署等高级特性。结合当下趋势来看2026年Java面试中企业已经非常明确地要求开发者具备JVM底层原理等高阶能力而面试题的难度也已进化到类似“请结合G1垃圾回收器原理说明如何调整参数避免Full GC”这样的实战型问题。2️⃣ JVM基础先读懂内存布局要理解GC首先得知道JVM的内存是如何划分的。下面是JVM运行时数据区JDK 8的结构图JVM运行时数据区主要分为两大类线程私有区域随线程生灭程序计数器记录当前线程执行的字节码行号是JVM中唯一不会出现内存溢出的区域。虚拟机栈描述Java方法执行的内存模型每个方法被执行时创建一个栈帧存储局部变量表、操作数栈、动态链接等。本地方法栈类似虚拟机栈但为native方法服务HotSpot中与虚拟机栈二合一。线程共享区域GC主要战场堆JVM管理的内存最大区域几乎所有对象实例都在这里分配是垃圾收集器管理的重点。方法区存储已加载的类信息、常量、静态变量、即时编译器JIT编译后的代码等。JDK 8后改为元空间Metaspace使用本地内存而非堆内存避免了永久代内存溢出的问题。一句话总结GC主要管理的就是堆这片广袤的区域。而栈和方法区的内存管理相对简单。3️⃣ GC核心原理如何判断对象已“死”JVM在做垃圾回收前第一步要决定“哪些对象是垃圾”。判定方法主要有两类。3.1 引用计数法早期设计JVM目前不采用原理很简单给每个对象一个计数器当有地方引用它计数器就1引用失效计数器就-1。当它的值为0时对象就是可回收的垃圾。其致命的缺陷在于无法解决循环引用即两个对象互相引用外部再无引用但计数器值都不为0JVM并没有采用这种机制。3.2 可达性分析算法JVM实际采用的标准✅JVM选用了更精准和严谨的可达性分析算法来解决跨代循环引用等问题。思路是从一系列称为GC Roots的根节点出发向下搜索引用链Reference Chain。如果一个对象到任意GC Roots之间都没有引用链相连则证明该对象不可用。GC Roots可作为根节点的五大类对象虚拟机栈栈帧中的本地变量表中引用的对象。本地方法栈中JNINative方法引用的对象。方法区中类静态属性引用的对象。方法区中常量引用的对象。同步锁synchronized持有的对象。4️⃣ 垃圾回收算法与分代模型判断出垃圾后JVM就得想用什么“工具”来打扫。针对不同的内存区域JVM会采用不同的打扫方式。4.1 三大基础回收算法标记-清除实现简单但会有两遍扫描且易产生大量不连续内存碎片影响大对象分配再次触发GC。复制算法将内存分成两块每次只使用一块存活对象复制到另一块。优点是回收高效且无碎片缺点是一半的内存被浪费。适合存活对象少的新生代。标记-整理先标记存活再将所有存活对象向一端移动最后直接清除边界外的内存。优点是解决了内存碎片缺点是移动对象成本较高适合老年代。4.2 分代收集理论JVM实际使用的智慧没有一种“万能”的回收算法能满足所有场景。分代收集理论就是当前JVM的“最优解”新生代Young Generation存放“朝生夕死”的对象。特点是每次GC都有大量对象死亡存活率极低。标记-复制算法性价比最高。它细分为Eden区和两个Survivor区From和To比例默认为8:1:1。老年代Old Generation存放历经多次GC仍存活的对象。特点是存活率较高。适合选择标记-清除/标记-整理算法降低移动成本或干脆积攒后一并整理。对象晋升流程新对象先分配在Eden区 → Eden满了触发Minor GC → 存活对象复制到Survivor年龄1→ 默认对象年龄达到15可配-XX:MaxTenuringThreshold时晋升。5️⃣ 垃圾收集器演进史从Serial到ZGC有了算法这个大“思想”JVM为了实现多彩的“姿势”设计了多种垃圾收集器。其迭代逻辑主线是追求更高的吞吐量 → 追求更可控的延迟 → 追求极致的极低延迟。5.1 第一代Serial / Parallel —— 吞吐为王Serial GC使用单线程进行垃圾回收GC期间会触发STWStop-The-World。适合单核CPU或小型应用。Parallel ScavengePS MarkSweep/PS Scavenge也常指Parallel GC系列使用多线程回收充分利用多核CPU资源极大提升吞吐量。曾是JDK 7/8的默认收集器适合后台批处理计算场景。5.2 第二代CMS —— 低延迟先锋随着Web应用对响应时间要求提高CMSConcurrent Mark Sweep并发标记清除应运而生。它的目标是通过“并发”来减少GC停顿时间。CMS缺点也很明显会产生大量内存碎片会抢占CPU资源且无法处理浮动垃圾。在JDK 9中已废弃JDK 14中已被移除。5.3 第三代G1 —— 可预测停顿的大堆全能王为替代CMS而生G1现在已彻底奠定其JDK 9及以上版本默认垃圾收集器的地位。它将Java堆划分为约1MB到32MB大小相等的若干个独立区域Region每次优先回收垃圾最多的RegionGarbage First实现停顿时间模型可配置化。5.4 第四代ZGC / Shenandoah —— 超低延迟亚毫秒级随着要求更高的实时系统和超大堆场景出现JDK 11引入ZGC目标锁定毫秒级GC停顿不超过10ms支持TB级堆内存。ZGC核心技术是染色指针和读屏障GC过程几乎全并发仅留下极短暂的STW阶段。核心趋势是从“尽量少停”CMS走向“可设上限”G1再迈向“几乎不停”ZGC。5.5 收集器全景对比选型指南ZGC相比G1在GC卡顿上确实有较大提升但在极小内存下ZGC不能像G1一样正常启动且在同样大小的JVM堆内存压测场景下G1可承载的数据量会更大一些。6️⃣ 线上GC调优实战日志分析 参数调优学完理论与选型我们来看一个真实的调优案例。某大厂线上服务突现性能卡顿监控显示频繁Full GC。通过GC日志分析和参数调优仅用很小的成本就恢复了系统。关键步骤设计如下开启GC日志必备这是分析内存问题的“黑匣子”。# G1 GC生产环境配置示例 -Xms8g -Xmx8g -XX:UseG1GC -XX:MaxGCPauseMillis100 -Xloggc:/var/log/app/gc.log -XX:PrintGCDetails -XX:PrintGCDateStamps使用分析工具比如GCViewer直接打开.log文件或GCEasy.io上传日志文件分析停顿时长等。观察GC指标与反模式指标类包括堆使用率、平均停顿、Full GC频次等。反模式包括某个CMS-initial-mark的全局停顿异常高一般为代码局部大对象分配所致系统可动态扩展Metaspace需规避线上动态扩容或线上采用已废弃的老收集器导致Metaspace碎片化严重引起Full GC等。调整参数并验证案例分析及量化收益下图解析实战案例中的典型配置与调优参数推荐、压测效果如下7️⃣ 总结与选型建议GC调优的核心目标始终是减少停顿时间低延迟 提升吞吐量。而为了达成目标日常开发中还需落实三大原则量化为先调优前先根据场景确定明确目标如P99延时降低30%优化过程要以基线和量化数据驱动增强信心和可观测性。最小干预JVM的调优是“不得已”的手段。JVM自身已发展出很强的自适应能力应首先从代码层面、架构设计上去系统性解决。团队共建建立团队内部的标准化GC参数基线、演练与复盘机制整个系统才具备长期稳定性。JDK版本选择建议新项目建议使用JDK 11及以上版本从G1开始之后根据压力选择G1或ZGC。核心业务可限制JDK长期支持版本避免非必要升级导致回归风险。你做过JVM调优吗在面试或实际项目中有没有遇到过“玄学”的GC问题——看起来GC参数已经优化到极致但延迟依然抖动或者遇到过GC日志中完全无法解释的长停顿欢迎在评论区分享你遇到过的“最诡异GCCase”或内存排查踩坑我们一同复盘交流。

相关文章:

一文搞懂:JVM垃圾回收(GC)算法与调优实战——从分代回收到G1、ZGC

写在前面 我们很多Java程序员都有这样的经历:工作三五年,写业务代码驾轻就熟,各种框架用得飞起,但突然有一天,线上系统OOM了,看不懂日志、不知如何排查、重启解决一切,事后却根本不知道为什么。…...

大语言模型可解释性:从注意力机制到概念激活的AI内窥技术

1. 项目概述:为什么我们要“解剖”AI的大脑?“从黑盒到内窥”,这个标题精准地戳中了当前大语言模型(LLM)领域最核心的焦虑与渴望。我们每天都在与ChatGPT、Claude、文心一言这样的AI对话,惊叹于它们流畅的文…...

从具身智能到递归处理:构建可测量的AI意识指标技术框架

1. 项目概述:为什么我们需要“意识指标”?最近几年,AI领域最让人兴奋也最让人困惑的词,可能就是“意识”了。从AlphaGo下棋到GPT-4写诗,我们不断惊叹于AI的能力,但心底总有个疑问:这玩意儿&…...

浏览器资源嗅探技术深度解析:从网络请求到媒体文件提取

浏览器资源嗅探技术深度解析:从网络请求到媒体文件提取 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 在当今多媒体的互联网时代&…...

Kubernetes AI助手:用自然语言生成YAML,提升集群管理效率

1. 项目概述:当Kubernetes遇上AI助手如果你和我一样,每天都要和成百上千个Kubernetes资源清单(YAML)打交道,那么“sozercan/kubectl-ai”这个项目,绝对值得你花上十分钟了解一下。它不是一个全新的编排工具…...

SkillMana:AI编程技能本地化管理利器,符号链接与智能路由解析

1. 项目概述:SkillMana,一个为AI编程伙伴管理“技能包”的本地利器 如果你和我一样,深度使用Cursor这类AI编程工具,那你一定遇到过这个甜蜜的烦恼:官方和社区提供的“技能”(Skills)越来越多&a…...

量子点自动调谐技术FAlCon框架解析与应用

1. 量子点自动调谐的挑战与FAlCon的诞生 量子点技术作为固态量子计算的主流平台之一,其核心优势在于能够与现代半导体制造工艺兼容,实现高密度的量子比特集成。我在实验室工作的十年间,亲眼见证了量子点设备从最初的单量子比特系统发展到如今…...

HPH构造内部结构图解

HPH作为一种在众多领域广泛应用的常见的高效分离与反应设备,其内部构造对于整个设备的运行稳定性以及处理效果起着决定性作用。深入了解HPH的构造,对于日常操作维护有着极大的帮助,能够让我们在操作过程中更加得心应手,同时更能助…...

如何理解hph的构造与设计要点

hph作为一种重要的结构形式,其构造设计直接关系到整体性能和使用寿命。正确理解hph的基本构造原理,能够帮助我们在实际应用中做出更合理的选型与维护决策。 hph的主要类型有哪些 从构造角度来看,hph可以分为单层结构和复合结构两大类。单层结…...

韩国投资证券Open API实战:AI驱动量化交易系统构建指南

1. 项目概述:一个为AI与开发者设计的证券交易自动化工具箱如果你是一名对量化交易或程序化交易感兴趣的Python开发者,或者你正在探索如何让大型语言模型(LLM)如ChatGPT、Claude来辅助甚至执行金融分析决策,那么你很可能…...

DownKyi终极指南:5步轻松下载B站8K超高清视频 [特殊字符]

DownKyi终极指南:5步轻松下载B站8K超高清视频 🎬 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印等…...

医学影像AI偏见评估与缓解:从合成数据到对抗学习的公平性实践

1. 项目概述:当AI“看”病时,它真的公平吗?最近几年,医学影像AI的发展速度,快得有点让人目不暇接。从肺结节筛查到眼底病变分析,AI模型在特定任务上的表现,甚至已经能比肩经验丰富的放射科医生。…...

AI/ML学生持续参与意愿研究:从影响因素到测量模型

1. 项目概述:为什么我们要关心“持续参与意愿”?在机器学习与人工智能这个领域待了十几年,我见过太多满怀热情入行的学生,从最初的“我要改变世界”到后来的“这行太卷了,我还是考公吧”。这个现象背后,其实…...

AI意识评估:从神经科学理论到工程化指标的技术实践

1. 项目概述:当AI触及“意识”的边界在人工智能领域,我们正站在一个前所未有的十字路口。过去十年,我们见证了AI从执行特定任务的“工具”,演变为能够生成流畅文本、创作图像、甚至进行复杂推理的“系统”。随着这些系统行为越来越…...

利用Taotoken模型广场为AIGC应用选择最佳文本生成模型

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 利用Taotoken模型广场为AIGC应用选择最佳文本生成模型 对于从事内容生成或创意写作类应用的团队而言,选择合适的文本生…...

2026届最火的降AI率工具解析与推荐

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 想要把内容被判定为AIGC的可能性降低,能够从下面这些方面予以优化:第…...

基于Nix与清单驱动的个人DevOps中心:模块化构建创意工作流

1. 项目概述:一个为创意工作者打造的个性化开发运维中心 如果你和我一样,是个在Mac上工作的创意从业者——无论是音乐制作、音频工程、3D设计,还是涉足AI应用开发——那么你一定经历过那种“新机器到手,万事开头难”的阵痛期。一…...

开源家庭医生系统:从健康数据管理到智能提醒的完整实现

1. 项目概述:一个家庭医生的开源实现最近在逛GitHub的时候,发现了一个挺有意思的项目,叫dipo78/family-doctor。光看名字,你可能会觉得这是个医疗健康类的应用,或者是个预约挂号平台。但点进去仔细研究后,我…...

CANN/cann-recipes-train:DeepSeek-V3 MXFP8/HiF8低精度预训练优化实践

DeepSeek-V3 MXFP8/HiF8 低精度预训练优化实践样例 【免费下载链接】cann-recipes-train 本项目针对LLM与多模态模型训练业务中的典型模型、加速算法,提供基于CANN平台的优化样例 项目地址: https://gitcode.com/cann/cann-recipes-train 概述 本样例针对De…...

太赫兹MIMO混合预编码与相位噪声抑制技术

1. 太赫兹混合预编码MIMO系统概述在无线通信领域,太赫兹频段(90-300GHz)因其巨大的连续带宽资源成为6G通信的关键技术方向。然而,这一频段面临严重的路径损耗和硬件实现挑战,特别是相位噪声问题。大规模MIMO技术通过部…...

XUnity翻译器:3步实现游戏自动汉化的完整指南

XUnity翻译器:3步实现游戏自动汉化的完整指南 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 还在为外语游戏中的生涩文本而烦恼吗?是否曾经因为语言障碍而错过精彩的游戏剧情&…...

ARM虚拟处理器模型在无线设备开发中的关键作用

1. ARM虚拟处理器模型在无线市场中的核心价值 现代无线设备(如智能手机)的设计复杂度正呈指数级增长。以2023年旗舰手机为例,其SoC通常集成: 3-4个ARM Cortex-X/A系列高性能CPU核心 4-6个ARM Cortex-A系列能效核心 1-2个专用DS…...

Kitty CLI工具集:基于场景与剧本的终端自动化实践

1. 项目概述:一个面向开发者的现代化终端工具集如果你和我一样,每天的工作都离不开终端,那你一定对“效率”这个词有切肤之痛。从SSH连接到服务器,到管理本地多个项目环境,再到执行复杂的命令行操作,一个趁…...

AI驱动的内容管理平台架构解析:从内容图谱到智能工作流

1. 项目概述:当内容管理遇上AI,Contentrain/AI的定位与价值最近在和一些做独立产品、内容站点的朋友聊天,发现一个挺普遍的现象:大家花在内容创作和整理上的时间,远超过产品功能开发本身。从博客文章、产品文档&#x…...

Torch-Pruning:基于DepGraph的PyTorch结构化剪枝实战指南

1. 项目概述与核心价值如果你正在为部署一个庞大的深度学习模型而发愁,看着动辄几十GB的显存占用和缓慢的推理速度感到束手无策,那么“模型剪枝”这个技术你一定不陌生。但传统的剪枝工具往往只支持有限的网络结构,一旦遇到复杂的模块连接、残…...

Rust终端光标控制库cursory:提升CLI/TUI应用交互体验

1. 项目概述:一个为开发者打造的终端光标样式库如果你和我一样,每天有超过一半的时间是在终端里度过的,那你一定对那个闪烁的光标再熟悉不过了。无论是写代码、跑脚本还是调试程序,光标就是我们在命令行世界里的“鼠标指针”。但你…...

Alfred AskGPT:在任意输入框调用ChatGPT的原位AI助手配置指南

1. 项目概述如果你和我一样,是个重度依赖键盘和效率工具来工作的Mac用户,那你肯定对Alfred不陌生。它就像是我们电脑上的“瑞士军刀”,一个快捷键呼出,就能快速搜索、打开应用、执行脚本,把我们从繁琐的鼠标点击中解放…...

集成学习在药物虚拟筛选中的应用:构建稳健AI预测模型

1. 项目概述:一个面向药物发现的智能虚拟筛选工具最近在药物研发的早期阶段,我花了不少时间研究如何提升虚拟筛选的效率和精度。传统的基于分子对接的筛选方法虽然经典,但计算成本高,对大规模化合物库的筛选往往力不从心。这时候&…...

Datadog Cursor插件:用自然语言对话查询监控数据的完整指南

1. 项目概述:在IDE里用自然语言查询Datadog如果你和我一样,日常开发离不开Datadog来监控应用状态,同时又重度依赖Cursor这类AI驱动的IDE来提升效率,那么最近Datadog官方推出的这个Cursor插件,绝对值得你花十分钟了解一…...

命令行办公自动化:officecli-skills技能库实战指南

1. 项目概述:一个为命令行注入办公能力的技能库如果你和我一样,每天的工作流都离不开终端,同时又需要频繁处理文档、表格和演示文稿,那么你肯定也经历过那种在图形界面和命令行之间反复横跳的割裂感。officecli/officecli-skills这…...