Java虚拟机:G1垃圾回收器
一、 为什么需要 G1化整为零的思想在 G1 出现之前无论是新生代Minor GC还是老年代CMS垃圾回收总是面对一整块“巨大的内存”。这导致STW 时间长扫描全堆或全代非常耗时。内存碎片CMS 使用“标记-清除”算法回收后产生大量不连续空间导致大对象无法分配触发 Full GC。G1 的核心突破区域化Region。G1 将整个堆内存Heap化整为零划分成了大小相同的多个独立子区域Region。这就好比将一整块大的田地划分成了一块块小方格G1 可以针对性地回收某些“脏”的方格而不必每次都犁遍整块地。Region 的大小JVM 启动时自动设定通常为1MB ~ 32MB且必须是 2 的幂。默认会将整堆划分为2048个 Region。内存上限通过参数-XX:G1HeapRegionSizen可指定大小。由于最大只有 2048 个区域所以最大支持32MB * 2048 64GB的堆内存。✨ G1 的五大“杀手锏”特性并行性回收期间多线程并行工作充分利用多核 CPU 缩短 STW。并发性部分回收步骤与应用程序用户线程交替执行不阻塞应用。分代 GC逻辑上虽然物理上不再区分新生代和老年代但逻辑上依然存在 Eden、Survivor 和 Old 区只是这些区域是可以动态切换的。空间整理通过复制算法回收每次 GC 都会压缩空间彻底解决内存碎片问题。可预见性由于分区G1 可以预测停顿时间只选择部分垃圾最多的 Region 进行回收即CSet极大降低了单次 GC 的影响。二、 图解 G1 堆内存布局Region 地图G1 的内存布局不再像传统堆那样是固定的Eden和Old长条而是由无数个Region方格组成 E (Eden)新生代存活率低GC 频繁。 S (Survivor)幸存者区用于存活对象在新生代之间的周转。 O (Old)老年代存放长生命周期对象。 H (Humongous)巨型对象区G1 独有的特殊区域。当一个对象的大小超过单个 Region 的 50%G1 会将其分配在连续的 H 区。坑点提示如果 H 区装不下需要连续拼接多个 H 区。如果找不到连续空间就会导致 Full GC。 核心逻辑这些 Region 并不是固定不变的。在运行过程中一个原本是Eden的区域可能经过回收后变为Old完全取决于需求。这种“逻辑分代、物理分区”的设计也是 G1 灵活性的来源。三、 G1 的两大回收过程详解G1 的回收分为两种核心场景新生代 GC (Young GC)和并发标记混合 GC (Mixed GC)。1. 新生代 GC (Young GC) —— “复制与晋升”触发时机当 Eden 区的空间耗尽时触发 Young GC。操作流程基于复制算法Eden ➡️ Survivor将 Eden 区中存活的对象复制到一个 Survivor 区。Survivor ➡️ Survivor/Old将原 Survivor 中的存活对象根据年龄Age判定移到另一个 Survivor 区或直接晋升到 Old 区如果年龄达标或 Survivor 容量不足。清空 Eden垃圾对象被彻底清理形成连续的内存块。特点这是一个完全 STWStop-The-World的过程但只扫描 Eden 区和相关的 Survivor 区速度极快。2. 并发标记周期与混合 GC (Mixed GC) —— “渐进式清理”目标处理老年代Old 区和巨型区H 区的垃圾降低整体停顿。整个并发标记周期分为 6 个精准步骤重点步骤名称是否 STW核心动作详解①初始标记✅STW标记从GC Roots直接可达的对象。注意这一步会伴随一次新生代 GC 执行标记过程极短。②根区域扫描❌ 并发扫描 Survivor 区直接可达的老年代对象。不能和新生代 GC 同时执行因为新生代会修改 Survivor 区③并发标记❌ 并发最长、最耗时的阶段。GC 线程与应用线程共同运行扫描整个堆查找存活对象。应用线程的变动会通过SATB (Snapshot-At-The-Beginning)算法记录快照防止误判。④重新标记✅STW由于并发标记期间应用还在跑结果可能不准确。这一步会补充修正标记最终确定存活对象。⑤独占清理✅STW统计各个 Region 的存活对象比例进行排序并识别出垃圾最多Garbage-First的区域确定下一次混合回收的CSet集合。⑥并发清理❌ 并发仅清除完全空闲的 Region。 混合回收 (Mixed GC)在并发标记完成后G1 会挑选出之前识别的“高收益” Region即垃圾最多的那几个执行一次混合回收。这个过程也是复制算法会搬运存活对象到新的 Region从而腾出大量空间并顺便完成内存碎片整理。四、 不得已的 Full GC —— 鱼和熊掌的平衡尽管 G1 很强大但世界并非完美。Full GC 触发当内存分配太快并发收集跟不上的时候例如并发标记还没结束老年代就满了G1 不得不降级退化为单线程的 Full GC即完全 STW且速度很慢性能骤降。与 CMS 的相似性和 CMS 类似G1 依然无法 100% 避免全堆停顿特别是在高并发、高频分配的大内存场景下。五、 G1 实战调优参数核心配置清单了解底层原理是为了更好的调优。以下是 G1 最关键的几个参数参数名默认值作用及调优建议-XX:UseG1GC无开启 G1 垃圾收集器。从 JDK 9 起G1 已经是默认垃圾回收器。-XX:MaxGCPauseMillis200ms停顿时间目标。G1 会为了达到这个目标动态调整年轻代大小Eden/Survivor。注意设置过小如 50ms会导致 GC 更频繁吞吐量下降设置过大可能会使 Full GC 风险增加。-XX:ParallelGCThreadsCPU 核心数设置并行回收时的GC 工作线程数。通常不建议修改让 JVM 自动探测即可。-XX:InitiatingHeapOccupancyPercent45触发并发标记的堆占用阈值。当整个堆占用率达到 45% 时开始并发标记周期。⚠️重要警醒此参数设置过大如 50%可能导致堆满而触发 Full GC设置过小如 30%会导致并发标记频繁启动大量占用 CPU拖累业务应用性能。调优黄金法则G1 的目标是“软实时”即MaxGCPauseMillis是一个尽力而为的目标而不是强制标准。在调优时我们应该优先关注吞吐量和Full GC 的频率不要盲目追求极端的低停顿。六、 附G1 典型 GC 日志解析看懂了日志你才能知道 JVM 在底层干了什么。这是一段典型的 G1 Young GC 日志[GC pause (G1 Humongous Allocation) (young) (initial-mark), 0.0080719 secs] [Parallel Time: 5.1 ms, GC Workers: 10] -- 并发工作线程数量STW耗时 [Eden: 6144.0K(6144.0K)-0.0B(1024.0K) -- Eden区 6MB - 0MB新Eden为1MB Survivors: 0.0B-0.0B -- Survivor 空间变化 Heap: 8262.9K(10.0M)-6516.9K(10.0M)] -- 整个堆从 8.2MB 降低到 6.5MB [Times: user0.00 sys0.00, real0.01 secs]日志解读GC pause (young) (initial-mark)这是一次 Young GC并且伴随了“初始标记”。Heap: ... - ...说明堆内存发生了回收垃圾被清理了。时间开销real0.01 secs(10ms)说明这次 GC 停顿几乎对用户无感知。并发标记结束日志[GC concurrent-root-region-scan-start] -- 开始根区域扫描 (并发) [GC concurrent-root-region-scan-end, 0.0000227s] [GC concurrent-mark-start] -- 开始并发标记 (并发) [GC concurrent-mark-end, 0.0008297s] [GC remark ... 0.0017108 secs] -- 重新标记 (STW) [GC cleanup 7215K-7215K(10M), 0.0012619 secs] -- 清理空闲区域 (并发)总结G1 作为一款现代化的垃圾回收器其核心价值在于“化整为零”的 Region 设计和“暂停时间可控”的混合回收机制。它不仅解决了 CMS 长期存在的内存碎片问题还通过并发与并行极大地降低了 STW 的冲击。但也要记住一切优化都有代价。为了降低停顿G1 牺牲了部分内存空间如额外的记忆集 Remembered Set和 CPU 计算资源。在 64GB 以下的大内存、对响应时间RT敏感、多核 CPU 的服务器环境下G1 是现阶段的最佳选择。

相关新闻

物联网设备安全芯片SE050与PIC18F2585集成指南

物联网设备安全芯片SE050与PIC18F2585集成指南

1. 为什么物联网设备需要专用安全芯片?在物联网设备开发中,安全性常常是最容易被忽视却又至关重要的环节。传统MCU(如PIC18F2585)虽然能完成基础控制任务,但在面对现代网络安全威胁时往往力不从心。去年某智能家居厂商…

2026/9/18 11:32:06 阅读更多 →
顺序表应用1:多余元素删除之移位算法

顺序表应用1:多余元素删除之移位算法

Problem Description 一个长度不超过10000数据的顺序表,可能存在着一些值相同的“多余”数据元素(类型为整型),编写一个程序将“多余”的数据元素从顺序表中删除,使该表由一个“非纯表”(值相同的元素在表中…

2026/9/21 9:21:00 阅读更多 →
通用大模型VS垂域大模型,小白必看!收藏学习行业AI新趋势

通用大模型VS垂域大模型,小白必看!收藏学习行业AI新趋势

本文详细解析了通用大模型与垂域大模型的核心区别,旨在帮助初学者理解AI模型的不同应用目标和系统设计。文章从任务、数据、评估三个角度对比了两种模型,并探讨了企业选择AI方案时需考虑的关键因素。通用大模型擅长多任务处理,而垂域大模型则…

2026/9/21 4:09:34 阅读更多 →

最新新闻

10分钟搞定黑苹果EFI:OpCore Simplify一键生成工具完整指南

10分钟搞定黑苹果EFI:OpCore Simplify一键生成工具完整指南

10分钟搞定黑苹果EFI:OpCore Simplify一键生成工具完整指南 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify OpCore Simplify 是一款开源的…

2026/9/21 19:13:52 阅读更多 →
别被标题党忽悠,一文搞懂爱奇艺转换器mp4背后的代码逻辑

别被标题党忽悠,一文搞懂爱奇艺转换器mp4背后的代码逻辑

别被标题党忽悠,一文搞懂爱奇艺转换器mp4背后的代码逻辑 看了一堆教程还是不会写项目?别急,咱们今天不聊虚的。很多应届生或者刚入坑的开发者,对着“爱奇艺转换器mp4”这种关键词搜了一大圈,发现要么全是付费软件广告,要么是过时的脚本,要么就是…

2026/9/21 19:13:52 阅读更多 →
搞定intor报错:从堆栈追踪到源码级入门到精通指南

搞定intor报错:从堆栈追踪到源码级入门到精通指南

搞定intor报错:从堆栈追踪到源码级入门到精通指南 盯着屏幕满屏红色的 Exception in thread main,是不是感觉脑子像被浆糊糊住?Java 的 StackTrace…

2026/9/21 19:13:52 阅读更多 →
Wasmtime 代码贡献规范实战:从 rustfmt、Clippy 到 cargo vet 与 unsafe 审查

Wasmtime 代码贡献规范实战:从 rustfmt、Clippy 到 cargo vet 与 unsafe 审查

Wasmtime 代码贡献规范实战:从 rustfmt、Clippy 到 cargo vet 与 unsafe 审查 【免费下载链接】wasmtime A lightweight WebAssembly runtime that is fast, secure, and standards-compliant 项目地址: https://gitcode.com/gh_mirrors/wa/wasmtime 本指南以…

2026/9/21 19:13:52 阅读更多 →
3个维度看懂亚马逊工具,从入门到精通避坑指南

3个维度看懂亚马逊工具,从入门到精通避坑指南

3个维度看懂亚马逊工具,从入门到精通避坑指南 看了一堆教程还是不会写项目?别慌,这不是你的错,是教程没讲透底层逻辑。很多应届生拿到 AWS 或者类似云平台的工具包,满脑子都是 API…

2026/9/21 19:13:52 阅读更多 →
3个方案对比:卡点视频生成技术图解原理

3个方案对比:卡点视频生成技术图解原理

3个方案对比:卡点视频生成技术图解原理 别再去翻那几百页的官方文档了,真的,没人有那个耐心。想搞懂 卡点视频 怎么在代码里实现,盯着 FFmpeg 或者 MoviePy 的英文 API 看,眼睛都花了还是抓不住重点。这时候,你需要的是…

2026/9/21 19:12:51 阅读更多 →

日新闻

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程 【免费下载链接】agentic-awesome-skills AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and …

2026/9/21 0:00:01 阅读更多 →
gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析 【免费下载链接】gin-vue-admin 🚀ViteVue3Gin拥有AI辅助的基础开发平台,企业级业务AI开发解决方案,内置mcp辅助服务,内置skills管理,…

2026/9/21 0:00:01 阅读更多 →
Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

桌面应用AI 应用插件系统 【免费下载链接】Wox A cross-platform launcher that simply works 项目地址: https://gitcode.com/gh_mirrors/wo/Wox 点击查看 免费下载 全功能插件(Full-featured Plugin)是 Wox 三类插件实现方式中能力最完整的…

2026/9/21 0:00:01 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/21 3:13:20 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/21 2:19:36 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/21 4:51:05 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/21 15:36:51 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/21 15:36:51 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →