news 2026/4/23 8:16:07

G1收集器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
G1收集器

微观标记复制,整体上标记整理

假设堆被分成10个Region,每个Region用括号表示,里面是对象的状态:L表示存活对象,G表示垃圾,E表示空闲。

初始状态:堆中有存活对象和垃圾,分布比较零散。

Region: 0 1 2 3 4 5 6 7 8 9
[L] [G] [L] [G] [E] [L] [G] [L] [G] [L]

G1会选择一个回收集(比如Region1,3,6,8,这些Region的垃圾比例高)。注意,G1的选择是基于“回收价值”的,这里我们假设这几个Region的垃圾最多。

微观复制:将回收集(Region1,3,6,8)中的存活对象复制到空闲Region(比如Region4,但注意,复制过程中可能会使用多个空闲Region,这里为了简单,假设全部复制到Region4,实际上会按顺序使用空闲Region)。

复制后,回收集中的存活对象被复制到了新的Region,同时这些回收集被清空,变成空闲Region。

复制过程:

Region1: 没有存活对象(全是垃圾),所以直接清空,变成空闲。

Region3: 没有存活对象,直接清空。

Region6: 没有存活对象,直接清空。

Region8: 没有存活对象,直接清空。

实际上,如果有存活对象,就会复制到空闲Region。但在这个例子中,我们假设这些Region全是垃圾,所以没有复制操作,直接清空。

回收后的状态:
Region: 0 1 2 3 4 5 6 7 8 9
[L] [E] [L] [E] [E] [L] [E] [L] [E] [L]

现在,我们看到空闲Region变多了(1,3,6,8),而且它们是分散的。但是,请注意,存活对象仍然分散在0,2,5,7,9。

接下来,G1会继续选择回收集(比如Region0,2,5,7,9,假设它们现在垃圾比较多,但实际上这里存活对象多,垃圾少,所以可能不会选它们,这里为了演示整体整理的效果,我们假设又经过了多次回收,每次回收都选择垃圾最多的Region,并将存活对象复制到空闲Region)。

假设经过多次回收后,存活对象被逐渐复制到堆的一侧,空闲Region集中在另一侧。

最终状态可能如下:
Region: 0 1 2 3 4 5 6 7 8 9
[L] [L] [L] [L] [L] [E] [E] [E] [E] [E]

这样,我们就看到:整体上,存活对象被整理到了堆的前半部分,后半部分是大块连续的空闲空间。这就是整体上的标记-整理效果。

但是,这个整理过程不是一次完成的,而是通过多次的复制回收(微观复制)逐步完成的。

所以,总结一下:

微观:每次回收,将选中Region(回收集)的存活对象复制到空闲Region,然后清空回收集。这是复制算法。

整体:经过多次回收,存活对象被逐渐移动并紧凑地放在一起,形成连续的存活对象区域和连续的空闲区域。这是标记-整理的效果。

Region的堆内存布局

G1不再坚持固定大小以及固定数量的
分代区域划分,而是把连续的Java堆划分为多个大小相等的独立区域(Region),每一个Region都可以
根据需要,扮演新生代的Eden空间、Survivor空间,或者老年代空间

高吞吐量与低延迟的平衡

低延迟:指单次垃圾回收事件导致的“Stop-The-World”停顿时间非常短。
吞吐量指的是:应用程序运行时间占总运行时间的比例。

高吞吐量策略通常意味着:

  • 更少的GC总时间(更多时间运行应用)
  • 但可能单次停顿时间较长

低延迟策略通常意味着:

  • 更短的每次停顿时间
  • 但可能需要更频繁的GC,总GC时间可能增加

    通过分区回收 + 停顿预测

可预测的停顿时间模型

优先处理回收价值收益最大的那些Region

四个步骤

总结

G1旨在为大内存、多核CPU的现代服务器应用提供可预测的、相对较短的停顿时间,同时保持较高的吞吐量,它通过Region化分区、停顿时间预测模型和增量式并发回收机制,在大堆内存管理上取得了吞吐量与延迟的最佳平衡。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 8:15:43

3步快速掌握PPTX2MD:从PPT到Markdown的智能转换

3步快速掌握PPTX2MD:从PPT到Markdown的智能转换 【免费下载链接】pptx2md a pptx to markdown converter 项目地址: https://gitcode.com/gh_mirrors/pp/pptx2md 你是否曾经遇到过这样的情况:需要将PPT演示文稿转换为文档格式,却不得不…

作者头像 李华
网站建设 2026/4/20 18:33:35

【CMDB系列】CMDB模型设计落地经验

官网原文(免费申请演示):【CMDB系列】CMDB模型设计落地经验 摘要:本文围绕CMDB模型设计落地展开,阐述CMDB作为IT运维核心数据源、工具基石与数字地图的核心价值,指出常见设计误区,明确最小化、消…

作者头像 李华
网站建设 2026/4/20 11:29:54

pdfmake终极指南:快速解决中文显示问题

pdfmake终极指南:快速解决中文显示问题 【免费下载链接】pdfmake Client/server side PDF printing in pure JavaScript 项目地址: https://gitcode.com/gh_mirrors/pd/pdfmake 你是否在使用pdfmake生成PDF时遇到中文内容显示为空白或乱码的困扰?…

作者头像 李华
网站建设 2026/4/18 13:16:38

【Java毕设源码分享】基于springboot+vue的小区社区停车场车位预约系统设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/4/18 12:43:12

阿里云 Serverless 计算 11 月产品动态

精选文章 算力成本降低 33%,与光同尘用 Serverless AI 赋能影视商业内容生产 ModelScope 模型一键上线?FunModel 帮你 5 分钟从零到生产 助力企业构建 AI 原生应用,函数计算 FunctionAI 重塑模型服务与 Agent 全栈生态 【本不该故障系列】…

作者头像 李华
网站建设 2026/4/22 3:18:28

字节跳动Seed-OSS 36B开源:512K上下文与动态推理改写企业级AI规则

字节跳动Seed-OSS 36B开源:512K上下文与动态推理改写企业级AI规则 【免费下载链接】Seed-OSS-36B-Base 项目地址: https://ai.gitcode.com/hf_mirrors/ByteDance-Seed/Seed-OSS-36B-Base 导语 字节跳动Seed团队于2025年8月20日正式开源Seed-OSS-36B系列大模…

作者头像 李华