软件体系结构 - 垃圾收集器(3)G1

简介: 【4月更文挑战第22天】软件体系结构 - 垃圾收集器(3)G1

G1 (Garbage-First) 是Java平台中的一种高级垃圾收集器,专为大型内存环境和对响应时间敏感的应用设计。G1 GC引入了许多创新特性,旨在提供可预测的停顿时间(pause time)、高吞吐量以及更好的整体性能。以下是G1 GC的关键特性和工作原理:

关键特性

  1. 并行与并发: G1 GC结合了并行和并发垃圾回收技术。在进行垃圾回收时,它使用多个线程并行处理,同时部分回收过程(如标记)与应用程序线程并发执行,以减少停顿时间。
  2. 分代与区域化: G1打破了传统的年轻代和老年代划分,将整个堆划分为大小相等的固定大小区域(Regions)。每个区域可以充当年轻代或老年代的一部分,根据对象的实际年龄动态调整角色。这种设计允许G1更加灵活、精细地管理内存。
  3. 停顿时间目标(Pause Time Target): G1允许用户指定最大停顿时间目标(例如,通过 -XX:MaxGCPauseMillis=<N> 设置),垃圾收集器会尽力在这个目标范围内完成回收工作。这使得G1非常适合对响应时间有严格要求的服务。
  4. 垃圾优先(Garbage-First): G1在回收过程中优先处理包含最多可回收垃圾的区域,即所谓的“垃圾最多”(Garbage-First)策略。这样可以更有效地利用回收时间,尽快释放出大量可用内存。
  5. 记忆集(Remembered Sets): G1使用记忆集来跟踪跨区域引用,避免全局扫描。记忆集记录了哪些区域的对象引用了其他区域的对象,使得在并发标记阶段能够快速定位到跨区域引用。

工作流程

G1 GC的垃圾回收过程主要包括以下几个阶段:

  • 初始标记(Initial Marking): 一个非常快速的STW阶段,仅标记出根集合直接可达的对象。
  • 并发标记(Concurrent Marking): 在此阶段,G1 GC与应用程序线程并发执行,递归遍历整个对象图,标记出所有可达对象。同时,维护记忆集以跟踪跨区域引用。
  • 最终标记(Final Marking): 另一个短暂的STW阶段,处理在并发标记阶段因应用程序活动而新增或删除的引用。
  • 清理(Cleanup): 一个短暂停顿,清理工作集统计信息,准备下一次垃圾回收。
  • 混合回收(Mixed Collection): G1 GC在每个回收周期内都会进行混合回收,同时回收年轻代和部分老年代。它会选择垃圾最多的区域进行回收,并将存活对象拷贝到新的区域。这个过程包括:
  • 年轻代回收(Young GC):类似于传统的Minor GC,回收Eden和Survivor区。
  • 老年代回收(Old GC):并发标记阶段确定哪些老年代区域包含大量垃圾,然后在STW阶段回收这些区域。

命令行选项

启用G1 GC,需在JVM启动时添加以下命令行选项:

Bash

1-XX:+UseG1GC

设置最大停顿时间目标(例如,设置为200毫秒):

Bash

1-XX:MaxGCPauseMillis=200

适用场景

G1 GC适用于以下场景:

  • 大内存应用:堆内存超过4GB,甚至达到几十GB乃至上百GB。
  • 对响应时间敏感:如实时服务、金融交易、Web服务等,需要可预测且较低的停顿时间。
  • 期望自动调优:G1 GC具备一定的自我调优能力,能够根据应用行为动态调整回收策略。

对比其他收集器

相较于Parallel GC,G1 GC提供了更细粒度的内存管理、更灵活的停顿时间控制以及对大内存环境更好的适应性。相比低延迟收集器如ZGC、Shenandoah,G1 GC在某些场景下停顿时间可能略长,但其在JDK早期版本中就已经成熟且广泛支持,兼容性更好。

总结来说,G1 GC是针对大型内存环境和对响应时间敏感应用设计的高级垃圾收集器,通过创新的区域化、垃圾优先策略以及可预测的停顿时间控制,为现代Java应用提供了高效、灵活的内存管理解决方案。在实际使用中,应根据应用特点、硬件配置和性能监控结果选择和调整垃圾收集策略。

相关文章
通过 ansible 创建 openstack 虚拟机并部署应用(实战篇)
前文 通过 ansible 创建 openstack 虚拟机并部署应用(配置篇) 接下来我们实战一下。 目录结构 ── ansible.cfg├── group_vars│ ├── all.yml├── openstack.
5815 0
|
8月前
|
人工智能 Java 程序员
一文彻底搞清楚电路中的焊接技术
最早的电路连接依赖导线、螺丝和螺母,如1920年代收音机内部构造所示。这种技术虽简单,但存在可靠性低、设备体积大、难以自动化等缺点。随着锡焊技术的出现,电子元件连接变得更加稳固,点对点构造随之普及。然而,这种方式仍面临维护难、标准化不足的问题。最终,电路板的引入使电路布局更加整洁,大大提高了可维护性和生产效率。 &gt; 动手实践,买个电烙铁试试吧!
122 0
|
10月前
|
弹性计算 负载均衡 安全
企业业务上云经典架构方案整体介绍
本次课程由阿里云产品经理晋侨分享,主题为企业业务上云经典架构。内容涵盖用户业务架构现状及挑战、阿里云业务托管经典架构设计、方案涉及的产品选型配置,以及业务初期如何低门槛使用。课程详细介绍了企业业务上云的全流程,帮助用户实现高可用、稳定、可扩展的云架构。
345 0
|
数据采集 算法 数据可视化
阿里云百炼开发者评测
阿里云百炼是一站式大模型开发平台,具有以下特点: 知识检索应用:搭建智能问答助手需经历数据准备、知识库建立、应用创建与配置、测试与优化四步,存在数据质量、索引构建、问答效果调优等困难,建议加强数据预处理、优化索引构建机制并加强产品支持和社区建设。 模型训练:通过数据准备、调优等操作提升模型问答效果,控制台操作指引清晰,但可增加更多行业模板并优化模型训练界面。 流程管理功能:通过自定义业务流程对接智能体应用满足场景需求,使用效果较好,但存在部分参数设置不明确的问题,建议预制系统模板方便用户学习。整体上,百炼功能全面,但在细节和用户体验方面有待改进。
495 1
|
存储 大数据 对象存储
ClickHouse 如何实现数据一致性
本文探讨了在 ClickHouse 中实现数据一致性的方法,主要关注 `ReplacingMergeTree` 引擎。该引擎允许更新已有数据,通过定期合并操作删除重复并保持最终一致性。然而,由于合并时间不可预测,单纯依赖此引擎无法确保实时一致性。为解决此问题,文章提出了四种策略:1)手动触发合并,但不建议频繁使用;2)使用 `FINAL` 查询,但在查询时合并数据,效率较低;3)通过标记和 `GroupBy` 查询实现一致性;4)在允许一定偏差的情况下,直接使用 `ReplacingMergeTree` 保持最终一致性。在实践中,推荐结合标记列和 `GroupBy` 以保证数据一致性。
808 0
|
SQL 消息中间件 Java
Flink部署问题之带上savepoint部署任务报错如何解决
Apache Flink是由Apache软件基金会开发的开源流处理框架,其核心是用Java和Scala编写的分布式流数据流引擎。本合集提供有关Apache Flink相关技术、使用技巧和最佳实践的资源。
|
机器学习/深度学习 人工智能 文字识别
一种基于YOLOv8改进的高精度红外小目标检测算法 (原创自研)
【7月更文挑战第2天】 💡💡💡创新点: 1)SPD-Conv特别是在处理低分辨率图像和小物体等更困难的任务时优势明显; 2)引入Wasserstein Distance Loss提升小目标检测能力; 3)YOLOv8中的Conv用cvpr2024中的DynamicConv代替;
1098 4
|
机器学习/深度学习 监控 算法
【传知代码】骨架行为识别-论文复现
骨架行为识别是计算机视觉中的关键技术,通过分析人体骨架轨迹和姿态来识别行为。它应用于人机交互、智能监控等领域,利用OpenPose等算法提取关键点信息。CTR-GCN是该领域的先进模型,优于2S-AGCN,通过通道拓扑优化和时间建模提高识别效果。模型包含通道细化、特征变换和维度增强三个部分。源码可在相关文章附件获取。骨架行为识别技术在视频理解、人机交互、运动分析等多个场景有广泛应用,并持续发展创新。
388 1
【传知代码】骨架行为识别-论文复现
|
Java 测试技术 持续交付
如何使用Spring Boot进行单元测试
如何使用Spring Boot进行单元测试
|
关系型数据库 MySQL
MySQL 分库分表实战
MySQL 分库分表实战
275 0