Java 新型垃圾回收器(Garbage First,G1)

简介: HotSpot 垃圾收集器实现Serial Collector(串型收集器)适用收集场景:1. 新生代收集(Young Generation Collection)2. 老年代收集(Old Generation Collection)Parallel Conllector(并行收集器)又叫吞吐量收集器(throughput collector)应用于多核系统。

HotSpot 垃圾收集器实现

Serial Collector(串型收集器)

适用收集场景:1. 新生代收集(Young Generation Collection)2. 老年代收集(Old Generation Collection)

Parallel Conllector(并行收集器)

又叫吞吐量收集器(throughput collector)应用于多核系统。
适用收集场景:1. 新生代收集是并行处理。2. 老年代收集和 Serial Collector 一样。

Parallel Compacting Collector(并行压缩收集器)

The parallel compacting collector was introduced in J2SE 5.0 update 6. The difference between it and the parallel collector is that it uses a new algorithm for old generation garbage collection
.

Note: Eventually, the parallel compacting collector will replace the parallel collector.

上述文字中 斜体 文字告诉我们,这个收集器和上一个并行收集器唯一的不同是在老年代使用了新的算法。

适用收集场景:1. 新生代收集(Young Generation Collector) 和Parallel Collector 相同;2. 老年代收集(Old Generation Collector)

Concurrent Mark-Sweep (CMS) Collector (并发标记清除)

Young generation collections 通常不会造成长时间停顿,然而old generation collections却是是造成长时间停顿的,虽然它不长出现,特别是在大的heaps回收被涉及到的时候。为了处理这个问题,HotSpot JVM 引入了一个叫做 concurrent mark-sweep(CMS) collector ,通常也被称为 低延时收集器low-latency collector
.

适用场景: 仅适用于老年代,新生代处理方式和Parallel Collector相同。

G1目标
G1 is planned as the long term replacement for the Concurrent Mark-Sweep Collector.
计划将G1作为CMS收集器的长久替代物。

它是为了平衡 延时和吞吐量之间的一种最优关系。

G1实现原理
基本属性
和CMS的相同点
CMS Replacement(CMS替代物)
Server 'Style' Garbage Collector(服务端垃圾收集器-内存,核数区别)
Parallel 并行
Concurrent 并发
Generational 分代
和CMS的主要区别
Good Throughput 良好的吞吐量
Compacting 压缩
Improved ease-of-use 提升了易用性(更多的JVM参数可用)
Predictable(though not hard real-time) 可预估的,非绝对实时。
基本概念
G1 堆布局
G1将堆分成若干固定大小的Region/区域(区域大小只有1、2、4、8、16和32M),G1的新生代和老年代都是一个无需连续的区域集合,每一个区域独立进行内存的分配和回收,区域是内存管理的基本单元,在某一个时间节点,可能是空闲的,当内存被请求时,内存管理器将空闲的Region分配到某个分代,然后归还应用分配给的空间。

大多数情况下,GC的操作同一时间只会在一个区域进行。

Region 分布

超大对象(Humongous Objects)

下图中跨区域的灰色模块即代表了超大对象,超大对象是指那些空间大小 >=1/2 个区域空间的对象.超大对象有时候会被以下特殊方式处理:

每个超大对象在老年代区域中的连续区域分配。对象分配起始于在连续区域中的首个成员,如果连续区域中的最后一个区域存在剩余空间的话,那么该空间将失去分配的机会,直到其关联的超大对象被完全回收
超大对象的回收通常仅在Cleanup停顿中的Marking结束后、或者在Full GC时。
超大对象的分配可能造成垃圾收集停顿过早地发生(主要是因为空间浪费。)
超大对象绝不会发生移动,即使在没有Full GC的情况下
image

回收周期

Young-only

Young-only 阶段的垃圾 收集 时逐渐地将老年代的对象填充到当前可用的内存。即将可以提升的新生代对象提升到老年代。

该阶段开始于Young-only的 收集 动作,也就是下图中的蓝色小球,每一个小球都是一次收集动作,也就是提升对象到老年代。Young-only 与Space-reclamation 过渡实际上是开始于 老年代空间 占用 达到某个阈值,即Heap初始化占用阈值。此时,G1将调度Initial Mark的Young-only收集(蓝色大球),而非常规的Young-only(蓝色小球)收集。

Initial Mark
此类收集开始于标记过程,附带一个常规的Young-only收集,并发标记决定所有在老年代区域中可达的存活对象是否要遗留到Space-reclamation 阶段。当标记过程未结束时,常规的Young-only 收集可能已经发生,等到标记完成时,将伴随着两个特殊的 Stop-The-World 停顿, Remark 和 CleanUp .

Remark 停顿

因为在 Initial Mark 标记过程中,因为它是并发执行,有可能会发生 Young-only 收集,造成标记数据有误差,因此需要重新标记一次,该过程为串行执行,会造成 Stop-The-World .

在Remark 和Cleanup之间,G1将并发地计算出一份对象存活性总结报告,它将在Cleanup停顿阶段更新内部的数据结构

Cleanup 停顿
该停顿同样将完整的回收空闲区域,并且决定 Space-reclamation 阶段是否需要继续跟踪,如果继续跟随的话,Young-only阶段的完成仅仅做 Young-only 收集动作。

Space-reclamation

Space-reclamation(空间回收/复用)阶段是回收老年代空间,同时处理新生代。

这个阶段由多个混合的收集动作组成,不仅包含新生代区域,同时也会排除老年代区域的存活对象,当G1发觉依然无法满足空闲的空间请求时,G1会终止本阶段。如果应用消耗完内存,G1将执行 Stop-The-World 的全堆压缩(Full GC)。

如下图所示:

<a href=https://i.loli.net/2019/08/05... ; width="400" >

2种过程是循环往复收集。

G1指令细节
初始空间占用
Initiating Heap Occupancy Percent(IHOP): Initial Mark 收集触发的阈值,为老年代空间定义Heap占用的百分比。

JVM 设置参数:-XX:InitiatingHeapOccupancyPercent

默认情况下,根据标记时间以及老年代在标记周期中的内存分配,G1垃圾收集器将自动抉择理想的IHOP的值。

JVM 失效参数:-XX:-G1UseAdaptiveIHOP

修改区域空间大小

-XX:G1HeapRegionSizeimage

G1 Vs. 传统垃圾回收器
G1 不区分新/老生代,只区分Region
G1 收集分2个阶段 Young-only 和 Space-reclamation

相关文章
|
7月前
|
存储 算法 Java
G1原理—6.G1垃圾回收过程之Full GC
本文详细探讨了G1垃圾回收器对Full GC(FGC)的优化处理,涵盖FGC的前置处理、整体流程及并行化改进。重点分析了传统FGC串行化的局限性以及G1通过Region分区和RSet机制实现并行标记的优势,包括任务窃取提升效率、跨分区压缩以生成空闲Region等技术细节。此外,文章还介绍了G1的新特性——字符串去重优化,通过判断char数组一致性减少重复字符串占用内存,从而提升内存使用效率。总结部分全面回顾了G1在FGC中的各项优化措施及其带来的性能改善。
G1原理—6.G1垃圾回收过程之Full GC
|
7月前
|
存储 算法 Java
G1原理—5.G1垃圾回收过程之Mixed GC
本文介绍了G1的Mixed GC垃圾回收过程,包括并发标记算法详解、三色标记法如何解决错标漏标问题、SATB如何解决错标漏标问题、Mixed GC的过程、选择CollectSet的算法
G1原理—5.G1垃圾回收过程之Mixed GC
|
7月前
|
存储 算法 Java
G1原理—4.G1垃圾回收的过程之Young GC
本文详细解析了G1垃圾回收器中YGC(Young Generation Collection)的完整流程,包括并行与串行处理阶段。内容涵盖YGC相关参数设置、YGC与Mixed GC及FGC的关系、新生代垃圾回收的具体步骤(如标记存活对象、复制到Survivor区、动态调整Region数量等),以及并行阶段的多线程操作和串行阶段的关键任务(如处理软引用、整理卡表、重构RSet)。
G1原理—4.G1垃圾回收的过程之Young GC
|
7月前
|
存储 缓存 算法
G1原理—3.G1是如何提升垃圾回收效率
本文深入探讨了G1垃圾回收器提升GC效率的核心机制,包括记忆集(RSet)、位图(BitMap)和卡表(CardTable)的设计与作用。记忆集通过记录跨代引用避免了不必要的老年代遍历,位图用于高效描述内存使用状态以优化标记过程,而卡表则在节约记忆集内存的同时提供更详细的引用信息。此外,文章还解析了DCQ(Dirty Card Queue)和DCQS(Dirty Card Queue Set)机制如何异步更新RSet,确保在高并发场景下的性能与准确性。这些设计共同提升了G1在标记、清理及整理内存时的效率。
270 10
|
10月前
|
存储 监控 算法
Java内存管理的艺术:深入理解垃圾回收机制####
本文将引领读者探索Java虚拟机(JVM)中垃圾回收的奥秘,解析其背后的算法原理,通过实例揭示调优策略,旨在提升Java开发者对内存管理能力的认知,优化应用程序性能。 ####
146 0
|
10月前
|
存储 监控 算法
Java虚拟机(JVM)垃圾回收机制深度解析与优化策略####
本文旨在深入探讨Java虚拟机(JVM)的垃圾回收机制,揭示其工作原理、常见算法及参数调优方法。通过剖析垃圾回收的生命周期、内存区域划分以及GC日志分析,为开发者提供一套实用的JVM垃圾回收优化指南,助力提升Java应用的性能与稳定性。 ####
|
10月前
|
监控 算法 Java
Java虚拟机(JVM)垃圾回收机制深度剖析与优化策略####
本文作为一篇技术性文章,深入探讨了Java虚拟机(JVM)中垃圾回收的工作原理,详细分析了标记-清除、复制算法、标记-压缩及分代收集等主流垃圾回收算法的特点和适用场景。通过实际案例,展示了不同GC(Garbage Collector)算法在应用中的表现差异,并针对大型应用提出了一系列优化策略,包括选择合适的GC算法、调整堆内存大小、并行与并发GC调优等,旨在帮助开发者更好地理解和优化Java应用的性能。 ####
233 27
|
11月前
|
机器学习/深度学习 监控 算法
Java虚拟机(JVM)的垃圾回收机制深度剖析####
本文深入探讨Java虚拟机(JVM)的垃圾回收机制,揭示其工作原理、常见算法、性能调优策略及未来趋势。通过实例解析,为开发者提供优化Java应用性能的思路与方法。 ####
230 28
|
11月前
|
算法 Java 开发者
Java内存管理与垃圾回收机制深度剖析####
本文深入探讨了Java虚拟机(JVM)的内存管理机制,特别是其垃圾回收机制的工作原理、算法及实践优化策略。不同于传统的摘要概述,本文将以一个虚拟的“城市环卫系统”为比喻,生动形象地揭示Java内存管理的奥秘,旨在帮助开发者更好地理解并调优Java应用的性能。 ####