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 ...
随机推荐
- Python更换下载源:提升包安装速度的实用指南
Python更换下载源:提升包安装速度的实用指南 Python作为一门广泛使用的编程语言,其强大的生态系统和丰富的第三方库是吸引众多开发者的关键因素之一.然而,在使用pip安装这些第三方库时,由于网络 ...
- Markdown文件上传到博客图片处理
Markdown文件上传到博客图片处理 在本地编写Markdown文章并准备上传到博客园时,经常会遇到的一个挑战是本地图片无法直接显示,因为它们存储在本地文件系统中.为了解决这个问题,有两种常见的策略 ...
- .NET适配HarmonyOS进展
1. 前言 目前国产化系统浪潮下,适配鸿蒙是中国软件大势所趋,.NET作为最适合开发客户端语言之一,适配鸿蒙系统(HarmonyOS Next)是目前.NET开发者最关心的事情.我目前业余时间正在移植 ...
- IDEA引入大项目一直updating indices解决办法
一.如项目不需要某个目录建立索引 右键需要排除的项目
- Anoii网络库之Timer实现
Timer的实现挺值得拿出来聊一聊的 Anoii网络库的事件循环: Timer是使用poll的timeout参数实现的,所以定时的精度是毫秒,对于一个网络库而言这足够了.如果不够的话,还可以使用tim ...
- 【忍者算法】从入环点到相遇点:深入理解环形链表 II|LeetCode第142题 环形链表 II
[忍者算法]从入环点到相遇点:深入理解环形链表 II|LeetCode第142题 问题升级:不止要找环,还要找入环点 在上一题中,我们讨论了如何判断链表是否有环.现在让我们更进一步:如果确定链表中有环 ...
- Java8 stream sorted排序时包括null
开发过程中对象集合根据某个属性排序是常常遇到的情况,但有时排序会遇到对应属性值为null的情况,会报空指针异常. 查找stream.sorted源码看到有Comparator.nullsFirst和C ...
- Redis 大 Key 分析利器:支持 TOP N、批量分析与从节点优先
背景 Redis 大 key 分析工具主要分为两类: 1. 离线分析 基于 RDB 文件进行解析,常用工具是 redis-rdb-tools(https://github.com/sripathikr ...
- Edge、谷歌浏览器默认下载器开启多线程下载
浏览器默认下载器开启多线程下载 Chrome 浏览器,地址栏输入并回车: chrome://flags/#enable-parallel-downloading Edge 新版浏览器,地址栏输入并回车 ...
- 搭建本地NCBI病毒库用于Blast
搭建本地NCBI病毒库用于Blast 目的:为了通过Blast剔除我数据集中所有与Human任意片段相似度超过97%的序列 日期:2022/11/17 1. Nt库下载 创建conda环境 conda ...