Java 的 G1 垃圾回收流程
Java 的 G1 垃圾回收流程
G1(Garbage-First)垃圾收集器 是一种区域化、并发、低延迟的垃圾回收器,适合大堆内存和对暂停时间有严格要求的应用程序。G1 的垃圾回收流程主要包括以下阶段:
1. 堆的区域化分区
在 G1 中,堆被分为多个大小相等的 Region,每个 Region 可以扮演以下角色之一:
- Eden:存储新创建的对象。
- Survivor:存储从 Eden 晋升的存活对象。
- Old:存储长期存活的对象。
- Humongous:存储超大对象(大小超过 Region 的 50%)。
2. 垃圾回收的主要阶段
2.1 年轻代垃圾回收(Young GC)
- 触发条件:
- Eden 区域内存耗尽。
- 回收流程:
- STW 初始标记:暂停应用线程,标记所有 Eden 区和 Survivor 区中不再使用的对象。
- 复制存活对象:将存活对象从 Eden 复制到 Survivor 或 Old 区。
- 更新引用:修复堆中引用的指向。
2.2 并发标记阶段
并发标记阶段的目的是标记整个堆中所有存活对象,识别可以回收的区域。分为以下几个步骤:
- 初始标记(STW):
- 标记 GC Roots 及直接可达对象。
- 与 Young GC 结合运行,减少停顿。
- 并发标记:
- 遍历堆中的对象图,标记所有可达对象。
- 与应用线程并发执行。
- 最终标记(STW):
- 修正并发标记阶段遗漏的引用变化,处理 SATB 缓冲区。
- 清理阶段:
- 统计各区域的回收价值,确定需要回收的区域。
2.3 混合垃圾回收(Mixed GC)
- 触发条件:
- Old 区的内存使用达到一定比例(默认是 45%)。
- 回收流程:
- 回收 Eden 和 Survivor 区。
- 按优先级回收部分 Old 区,优先清理垃圾比例最高的区域。
- 对回收的 Old 区进行整理(压缩)。
3. 关键机制
3.1 记忆集(Remembered Set)
- 用于记录跨区域的引用,避免全堆扫描。
- 每个 Region 都有一个 Remembered Set,记录指向该 Region 的引用。
3.2 分区优先级
- G1 按区域的垃圾比例排序,优先回收垃圾比例高的区域,称为“Garbage-First”策略。
3.3 SATB(Snapshot-At-The-Beginning)
- 在标记阶段使用快照集算法,记录堆在标记开始时的对象状态,确保标记过程一致性。
4. 回收阶段的 STW 停顿
G1 的设计目标是控制 STW 停顿时间:
- 通过并发执行标记和回收任务,减少全堆停顿时间。
- Mixed GC 和 Young GC 阶段的停顿时间由用户通过
-XX:MaxGCPauseMillis配置。
5. 总结
G1 垃圾回收流程通过分区、并发标记和分阶段回收实现高效的垃圾收集:
- Young GC:快速回收新生代,减轻老年代压力。
- 并发标记:遍历整个堆,标记存活对象。
- Mixed GC:结合 Eden 区和高垃圾比例的 Old 区回收,优化堆利用率。
G1 的核心在于其区域化设计和优先回收策略,通过最大程度降低垃圾回收对应用的影响,实现低延迟的性能优化。
Java 的 G1 垃圾回收流程的更多相关文章
- Java编程思想学习笔记_1(Java内存和垃圾回收)
1.Java中对象的存储数据的地方: 共有五个不同的地方可以存储数据. 1)寄存器.最快,因为位于处理器的内部,寄存器按需求分配,不能直接控制. 2)堆栈.位于通用RAM,通过堆栈指针可以从处理器那里 ...
- 高吞吐低延迟Java应用的垃圾回收优化
高吞吐低延迟Java应用的垃圾回收优化 高性能应用构成了现代网络的支柱.LinkedIn有许多内部高吞吐量服务来满足每秒数千次的用户请求.要优化用户体验,低延迟地响应这些请求非常重要. 比如说,用户经 ...
- CMS垃圾回收与G1垃圾回收
CMS垃圾回收与G1垃圾回收的比较请参见:http://colobu.com/2015/04/14/G1-Getting-Started/
- Java虚拟机之垃圾回收详解一
Java虚拟机之垃圾回收详解一 Java技术和JVM(Java虚拟机) 一.Java技术概述: Java是一门编程语言,是一种计算平台,是SUN公司于1995年首次发布.它是Java程序的技术基础,这 ...
- 【java虚拟机序列】java中的垃圾回收与内存分配策略
在[java虚拟机系列]java虚拟机系列之JVM总述中我们已经详细讲解过java中的内存模型,了解了关于JVM中内存管理的基本知识,接下来本博客将带领大家了解java中的垃圾回收与内存分配策略. 垃 ...
- java中存在垃圾回收机制,但是还会有内存泄漏的问题,原因是
答案是肯定的,但不能拿这一句回答面试官的问题.分析:JAVA是支持垃圾回收机制的,在这样的一个背景下,内存泄露又被称为“无意识的对象保持”.如果一个对象引用被无意识地保留下来,那么垃圾回收器不仅不会处 ...
- JVM G1垃圾回收算法简要介绍
JVM G1垃圾回收算法简要介绍 G1的特点 能够像CMS垃圾回收算法一样并发操作应用线程(潜台词:多核) 无需太长时间即可压缩空闲内存空间(潜台词:不会引起太多的GC停顿时间) 尽可能地让GC时长可 ...
- 每日一问:讲讲 Java 虚拟机的垃圾回收
昨天我们用比较精简的文字讲了 Java 虚拟机结构,没看过的可以直接从这里查看: 每日一问:你了解 Java 虚拟机结构么? 今天我们必须来看看 Java 虚拟机的垃圾回收算法是怎样的.不过在开始之前 ...
- 关于elasticsearch使用G1垃圾回收替换CMS
最近ES集群数据节点经常出现jvm占用过高,频繁GC导致ES集群卡死,很长时间才恢复.在网上看到用G1垃圾回收可以改善这一情况,但都是老版本的ES,我们现在使用的版本是5.5.2,所以想问问各位5.5 ...
- JDK8新垃圾回收机制--G1垃圾回收机制
G1全称是Garbage First Garbage Collector,使用G1的目的是简化性能优化的复杂性.例如,G1的主要输入参数是初始化和最大Java堆大小.最大GC中断时间. G1 GC由Y ...
随机推荐
- .net 通过 HttpClient 下载文件同时报告进度的方法
通过 HttpClient 的 ContentLength 很多时候都可以拿到下载的内容的长度,通过 ReadAsync 可以返回当前读到的长度,将读取到的长度加起来就是已经下载的长度 看起来很简单, ...
- OSI七层经典模型架构以及网络的基本概念
在大.中型网络中,通常通过模块化方式将网络功能结构进行分解.但是在各个模块内部,还是存在结构的扩展和弹性问题. 譬如一个园区网络需要接入大量用户等,这个问题一般通过网络的层次化来解决. 传统的网络采用 ...
- 第3章 在C#中创建类型
第3章 在C#中创建类型 3.1 类 复杂的类可能包含如下内容: 在 class 关键字之前:类特性(Attribute)和类修饰符.非嵌套的类修饰符有:public.internal.abs ...
- ceph数据重构原理
本文分享自天翼云开发者社区<ceph数据重构原理>,作者:x****n 在分布式存储系统Ceph中,硬盘故障是一种常见问题.为了保证数据安全,当发生硬盘故障后,分布式存储系统会依据算法对故 ...
- SecureCRT 屏幕输出行数设置
第一步:打开设置 第二步:设置历史展示行数 第三步:保存后重启软件即可
- 用python做时间序列预测六:相关函数图、偏相关函数图、滞后图
经典的时间序列预测方法都是假设如果一个时间序列有显著的自相关性,那么历史值对预测当前值会很有帮助,但是究竟取多少阶的历史值,就需要通过分析相关函数图和偏相关函数图来得到.本文介绍如何什么是相关函数图和 ...
- C# TorchSharp 图像分类实战:VGG大规模图像识别的超深度卷积网络
目录 图像分类 | VGG大规模图像识别的超深度卷积网络 数据集 直接下载 opendatalab 数据集社区 自定义数据集 模型训练 教程名称:使用 C# 入门深度学习 作者:痴者工良 教程地址: ...
- 八米云-N1盒子、S905系列机顶盒等设备-小白保姆式超详细刷机教程
线刷准备 这里以魔百盒CM211-1为例,本次刷机用到的零碎工具比较多,不过都是常见刚需设备,大家可以按照清单核对一下. 目前只支持S905 L3.L3a.L2 系列的各种盒子 机顶盒本体 电脑一台 ...
- 读论文-电子商务产品推荐的序列推荐系统综述与分类(A Survey and Taxonomy of Sequential Recommender Systems for E-commerce Product Recommendation)
前言 今天读的这篇文章是于2023年发表在"SN Computer Science"上的一篇论文,这篇文章主要对序列推荐系统进行了全面的调查和分类,特别是在电子商务领域的应用.文章 ...
- 震惊!AI编程正在淘汰这5类人,你在其中吗?
大家好,我是狂师. 今天在知乎上看到一个关于讨论:"人工智能大爆发,AI编程工具对程序员到底是颠覆还是辅助?'"问题,觉得蛮有意思.的确,AI编程的出现,引发了人们对于程序员职业未 ...