软件体系结构 - 垃圾收集器(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应用提供了高效、灵活的内存管理解决方案。在实际使用中,应根据应用特点、硬件配置和性能监控结果选择和调整垃圾收集策略。

相关文章
|
Java
G1垃圾回收器的工作流程
G1垃圾回收器的工作流程
1847 0
|
Java 算法 程序员
带你读《新一代垃圾回收器ZGC设计与实现》之一:垃圾回收器概述
JDK 11于2018年9月25日正式发布,这个版本引入了许多新的特性,其中最为引人注目的就是实现了一款新的垃圾回收器ZGC。
|
3月前
|
算法 安全 Java
Java内存管理:深入理解垃圾收集器
在Java的世界里,内存管理是一块基石,它支撑着应用程序的稳定运行。本文将带你走进Java的垃圾收集器(GC),探索它是如何默默守护着我们的内存安全。我们将从垃圾收集的基本概念出发,逐步深入到不同垃圾收集器的工作机制,并通过实例分析它们在实际应用中的表现。文章不仅旨在提升你对Java内存管理的认识,更希望你能通过这些知识优化你的代码,让程序运行更加高效。
57 3
|
7月前
|
存储 Java
软件体系结构 - 垃圾收集器(1)分代ZGC
【4月更文挑战第22天】软件体系结构 - 垃圾收集器(1)分代ZGC
160 2
|
7月前
|
监控 算法 安全
JVM工作原理与实战(二十三):堆的垃圾回收-引用计数法和可达性分析法
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了判断堆上的对象是否可以回收的方法(引用计数法、可达性分析法)、查看垃圾回收日志等内容。
77 0
|
7月前
|
存储 缓存 算法
五、垃圾收集基础
五、垃圾收集基础
59 3
|
7月前
|
存储 算法 Java
精华推荐 | 【JVM深层系列】「GC底层调优专题」一文带你彻底加强夯实底层原理之GC垃圾回收技术的分析指南(GC原理透析)
精华推荐 | 【JVM深层系列】「GC底层调优专题」一文带你彻底加强夯实底层原理之GC垃圾回收技术的分析指南(GC原理透析)
105 0
|
7月前
|
运维 监控 算法
JDK 21中的分代ZGC:内存管理的革命性进步
本文深入探讨了JDK 21中引入的分代ZGC(Z Garbage Collector)的工作原理、特性及其对现代应用程序性能的影响。分代ZGC是一种基于分代收集的垃圾回收器,通过优化内存分配和回收过程,实现了更高的吞吐量和更低的延迟。本文将分析分代ZGC的设计哲学、技术细节以及在实际应用中的优势,并展示如何通过配置和优化分代ZGC来提升Java应用程序的性能。
|
机器学习/深度学习 算法 Java
大牛用十年功力带你彻底理解JVM垃圾回收器:ZGC,回收设计
ZGC的并发回收算法采用的也是“目的空间不变性”的设计,关于目的空间不变性的更多内容可以参考第7章。 在第7章中提到,Shenandoah从JDK 13开始也采用“目的空间不变性”的设计。但是ZGC与Shenandoah相比,还是有不少细节并不相同,如表8-3所示。
|
存储 缓存 安全
16-垃圾回收相关概念
在默认情况下,通过System.gc()或Runtime.getRuntime().gc()的调用,会显式触发Full GC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存。
104 0
16-垃圾回收相关概念