1. JVM介绍和运行流程-CSDN博客

2. 什么是程序计数器-CSDN博客

3. java 堆和 JVM 内存结构-CSDN博客

4. 虚拟机栈-CSDN博客

5. JVM 的方法区-CSDN博客

6. JVM直接内存-CSDN博客

7. JVM类加载器与双亲委派模型-CSDN博客

8. JVM类装载的执行过程-CSDN博客

9. JVM垃圾回收-CSDN博客

10. 垃圾回收的算法-CSDN博客

11. JVM中的分代回收-CSDN博客

12. JVM的垃圾回收器-CSDN博客

13. G1垃圾回收器-CSDN博客

14. 垃圾回收的引用区别-CSDN博客

15. JVM调优的参数设置-CSDN博客

16. JVM调优工具-CSDN博客


1. G1垃圾回收器

G1(Garbage-First)垃圾回收器是Java HotSpot虚拟机中一种面向服务端应用的垃圾回收器,于JDK 7中首次推出,并在JDK 9及以后成为默认的垃圾回收器

内存布局

  1. 区域划分

    • 堆被划分为多个大小相等的Region(默认约2048个)

    • 每个Region可以是Eden、Survivor或Old区

    • 还有一种特殊的Humongous区用于存储大对象(大小超过Region 50%的对象)

  2. 分代管理

    • 仍然保留分代概念,但物理上不再连续

    • 年轻代:一组Region(Eden+Survivor)

    • 老年代:另一组Region


2. G1的三个核心阶段

2.1 年轻代回收(Young GC) —— 一阶段

特点

  • STW(Stop-The-World):完全暂停应用线程

  • 触发条件:Eden区填满时自动触发

  • 目标:快速回收年轻代(Eden + Survivor区)

工作流程

  1. 根扫描:标记GC Roots直接引用的对象。

  2. 存活对象标记:通过可达性分析标记年轻代存活对象。

  3. 复制/晋升

    • 存活对象被复制到Survivor区(复制算法)

    • 达到晋升阈值(-XX:MaxTenuringThreshold)的对象晋升到老年代。

  4. 区域清空:回收后的Eden区和部分Survivor区被标记为空闲。

关键点

  • 仅处理年轻代Region,耗时短(通常几毫秒到几十毫秒)。

  • 通过-XX:G1NewSizePercent-XX:G1MaxNewSizePercent动态调整年轻代大小。

图示过程:

  • 初始时,所有区域都处于空闲状态
  • 创建了一些对象,挑出一些空闲区域作为伊甸园区存储这些对象
  • 当伊甸园需要垃圾回收时,挑出一个空闲区域作为幸存区,用复制算法复制存活对象,需要暂停用户线程

E 表示:Eden 区

S 表示:Survivor 区

  • 随着时间流逝,伊甸园的内存又有不足
  • 将伊甸园以及之前幸存区中的存活对象,采用复制算法,复制到新的幸存区,其中较老对象晋升至老年代 


2.2 并发标记周期(Concurrent Marking Cycle)—— 二阶段

特点

  • 部分并发:大部分阶段与应用线程并发执行

  • 触发条件:老年代占用达到阈值(默认45%,通过-XX:InitiatingHeapOccupancyPercent调整)

  • 目标:全局标记堆中存活对象,确定回收优先级

分阶段流程

  1. 初始标记(Initial Mark,STW)

    • 短暂暂停,标记GC Roots直接关联的对象。

    • 通常与年轻代回收一起执行(借道Young GC)。

  2. 并发标记(Concurrent Mark)

    • 与应用线程并发,遍历整个堆,标记所有可达对象。

    • 使用SATB(Snapshot-At-The-Beginning)算法处理并发期间的对象变化。

  3. 最终标记(Remark,STW)

    • 处理并发标记期间漏标的对象(通过写屏障记录的变化)。

    • 引用处理(如清理软引用/弱引用)。

  4. 清理(Cleanup,STW)

    • 统计各Region的存活对象比例,排序回收价值(垃圾最多的优先)。

    • 不实际回收内存,但可能回收完全空闲的Region。

关键点

  • 并发标记周期为后续混合回收提供数据基础。

  • 通过-XX:ConcGCThreads可调整并发标记线程数。

图示过程:

当老年代占用内存超过阈值(默认是45%)后,触发并发标记,这时无需暂停用户线程


2.3 混合回收(Mixed GC)—— 三阶段

特点

  • STW:暂停应用线程

  • 触发条件:并发标记周期完成后,老年代Region达到回收阈值

  • 目标:同时回收年轻代和部分老年代(选择垃圾比例高的Region)

工作流程

  1. 年轻代回收:与Young GC相同,处理Eden和Survivor区。

  2. 老年代回收

    • 根据并发标记的结果,选择垃圾比例最高的老年代Region(Garbage-First策略)。

    • 存活对象被复制到其他Region(压缩算法减少碎片)。

  3. 多次增量回收

    • 可能分多次完成老年代回收,每次回收部分Region以控制停顿时间。

关键点

  • 通过-XX:G1MixedGCLiveThresholdPercent设置Region存活对象阈值(默认85%,存活对象过多则跳过)。

  • 通过-XX:G1MixedGCCountTarget控制混合回收的批次(默认8次)。

图示过程:

  • 并发标记之后,会有重新标记阶段解决漏标问题,此时需要暂停用户线程。
  • 这些都完成后就知道了老年代有哪些存活对象,随后进入混合收集阶段。
  • 此时不会对所有老年代区域进行回收,而是根据暂停时间目标优先回收价值高(存活对象少)的区域(这也是 Gabage First 名称的由来)

 混合收集阶段中,参与复制的有 eden、survivor、old

复制完成,内存得到释放。进入下一轮的新生代回收、并发标记、混合收集


三阶段关系图 


Full GC(后备方案)

异常情况:Full GC

当G1无法满足回收需求(如并发模式失败或晋升失败)时,会退化为单线程的Serial Old GC(Full GC),导致长时间停顿。应通过调整参数(如增加堆大小、降低InitiatingHeapOccupancyPercent)避免。


3. 问题总结

3.1 三阶段总结

G1 通过这三个阶段的配合,实现了低延迟高吞吐的平衡,尤其适合大内存、多核CPU的场景。

阶段并发性目标触发条件
年轻代回收STW快速回收Eden/SurvivorEden区满
并发标记周期部分并发标记全堆存活对象,确定优先级老年代占用达阈值(默认45%)
混合回收STW回收年轻代+高垃圾老年代Region并发标记周期完成后

3.2 说一下G1垃圾回收?

  • 应用于新生代和老年代,在JDK9之后默认使用G1
  • 划分成多个区域,每个区域都可以充当eden,survivor,old,humongous其中 humongous 专为大对象准备
  • 采用复制算法
  • 响应时间与吞吐量兼顾
  • 分成三个阶段:年轻代回收(stw)、并发标记周期(重新标记stw)、混合回收
  • 如果并发失败(即回收速度赶不上创建新对象速度),会触发Full GC

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/88647.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/88647.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/88647.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法学习笔记:13.归并排序——从原理到实战,涵盖 LeetCode 与考研 408 例题

归并排序是一种基于分治策略的经典排序算法,由约翰・冯・诺依曼在 1945 年提出。它以稳定的 O (nlogn) 时间复杂度和良好的可并行性,在大规模数据排序场景中占据重要地位。与快速排序的 “先分区后排序” 不同,归并排序采用 “先排序后合并”…

Kotlin基础学习记录

变量和函数 变量 // val为常量,一旦赋值就不可变 val a 10 val a: Int 10 a 3 // 报错// var为变量 var a 10 a 3 var b: Int 20 b 2函数fun add(a: Int, b: Int): Unit {a b // 报错,参数默认val }fun add(a: Int, b: Int) {var x: Int ax b …

【C#】GraphicsPath的用法

在 C# 中,GraphicsPath 是 GDI 提供的一个非常强大的类,用于创建和操作复杂图形路径。它可以用来绘制直线、曲线、多边形等形状,并支持判断点是否在路径内或路径的轮廓上。一、基本概念GraphicsPath 类功能:添加各种几何图形&…

C语言32个关键字

文章目录数据类型1、数据类型(12个)控制语句2、控制语句关键字(12个)存储类型3、存储类型关键字(4个)其他关键字4、其他关键字(4个)​一共32个关键字分为 数据类型 1、数据类型&am…

粒子滤波|粒子滤波的相关算法理论介绍

在自动控制、导航、目标跟踪等众多领域,系统状态估计是获取真实状态的关键环节。由于观测信号常受噪声干扰,滤波技术成为提取可靠信息的核心手段。本文将围绕目标跟踪技术中的滤波算法理论展开,重点解析粒子滤波框架的原理与应用。一、动态系…

Jenkins+Gitee+Docker容器化部署

写在前文 本文主要是通过Jenkins的maven项目版本GiteeDocker-maven插件来进行部署的,本文没有使用dockerfile/docker-compose。 本文默认已经安装了Docker 1、安装Jenkins Step1、创建文件夹当作映射jenkins的home文件夹 mkdir /app/jenkins Step2、赋权&#xff…

[Meetily后端框架] 多模型-Pydantic AI 代理-统一抽象 | SQLite管理

第5章:人工智能模型交互(Pydantic-AI 代理) 欢迎回来! 在上一章第四章:文字记录处理逻辑中,我们学习了TranscriptProcessor如何将冗长的会议记录分解为称为"块"的较小片段,因为人工…

利用DeepSeek实现rust调用duckdb动态链接库的duckdb CLI

提示词:请用rust调用duckdb-rs实现一个duckdb CLI,支持语法突出显示和计时,还支持命令行管道输入输出 Cargo.toml [package] name "duckdb-cli" version "0.1.0" edition "2024"[dependencies] duckdb "1.3.1&qu…

C++,从汇编角度看《虚拟继承的邪恶》

刷到一篇文章&#xff1a; 作者&#xff1a; 原文&#xff1a;虛擬繼承的邪惡 讨论到这样的一个程序&#xff0c;最终输出什么&#xff1f;&#xff1f;&#xff1f; 代码有简化命名 using namespace std;class A { public:A(int a 0) : v(a) {};int v; };template <type…

多 Agent 强化学习实践指南(一):CTDE PPO 在合作捕食者-猎物游戏中的应用详解

我们来详细讲解如何在合作捕食者-猎物游戏中结合 PPO (Proximal Policy Optimization) 算法。我们将聚焦于 CTDE&#xff08;Centralized Training, Decentralized Execution&#xff0c;集中训练、分散执行&#xff09; 模式&#xff0c;因为这是处理合作多 Agent 任务的常用且…

Web应用文件上传安全设计指南

引言 在当今的Web应用中&#xff0c;文件上传功能已成为基础且必要的服务能力&#xff0c;但不当的设计可能带来目录遍历、代码注入、服务端资源耗尽等安全风险。本文从威胁模型、安全设计原则、技术实现三个维度&#xff0c;系统阐述安全文件上传架构的设计要点。 一、威胁模型…

用 React Three Fiber 实现 3D 城市模型的扩散光圈特效

本文介绍了如何使用 React Three Fiber&#xff08;R3F&#xff09;和 Three.js 实现一个从中心向外扩散的光圈特效&#xff08;DiffuseAperture 组件&#xff09;&#xff0c;并将其集成到城市 3D 模型&#xff08;CityModel 组件&#xff09;中。该特效通过动态调整圆柱几何体…

【牛客刷题】COUNT数字计数

文章目录 一、题目介绍二、题解思路三、算法实现四、复杂度分析五 、关键步骤解析5.1 数字分解5.2 三种情况处理5.2.1 情况1: d < c u r d < cur d<cur(完整周期)5.2.2 情况2: d = c u r d = cur d=cur(混合周期)5.2.3 情况3: d > c u r d > cur d>cu…

AGV穿梭不“迷路”CCLinkIE转Modbus TCP的衔接技巧

在AGV控制系统集成中&#xff0c;工程师常面临一个现实难题&#xff1a;如何让CCLinkIE总线与Modbus TCP设备实现高效通信&#xff1f;这种跨协议的连接需求&#xff0c;往往需要耗费大量时间调试。本文将通过实际案例解析&#xff0c;为制造行业工程师提供可复用的解决方案。【…

【代码随想录】刷题笔记——哈希表篇

目录 242. 有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和 454. 四数相加 II 383. 赎金信 15. 三数之和 18. 四数之和 242. 有效的字母异位词 思路 代码 class Solution {public boolean isAnagram(String s, String t) {if (s.length() ! t.length()…

Python爬虫实战:研究messytables库相关技术

1. 引言 在当今数字化时代,互联网上存在着大量有价值的数据。然而,这些数据通常以不规则的格式存在,尤其是表格数据,可能包含复杂的表头、合并单元格、不规则布局等问题。传统的数据处理工具往往难以应对这些挑战。 网络爬虫技术可以帮助我们从网页上自动提取数据,而 mes…

Vue3的组件通信方式

通信方式适用层级数据流向复杂度Props/Emits父子组件单向/双向★☆☆v-model父子组件双向★☆☆Provide/Inject跨层级组件自上而下★★☆事件总线任意组件任意方向★★★Pinia/Vuex全局状态任意方向★★☆Refs模板引用父子组件父→子★☆☆作用域插槽父子组件子→父★★☆Web W…

创客匠人:大健康创始人IP如何用“社会责任”构建品牌护城河

一、商业与责任的失衡困局部分大健康IP将利润置于首位&#xff0c;甚至牺牲用户利益&#xff0c;导致品牌形象脆弱。某保健品公司因夸大宣传被曝光后&#xff0c;尽管销量曾达千万&#xff0c;却因缺乏社会认同&#xff0c;一夜之间崩塌&#xff0c;证明没有社会责任支撑的商业…

AI:机器人未来的形态是什么?

机器人未来的形态将受到技术进步、应用场景需求和社会接受度的综合影响&#xff0c;以下是对未来机器人形态的预测&#xff0c;涵盖技术趋势、设计方向和应用场景&#xff1a; 1. 形态多样化与通用化 人形机器人&#xff08;Humanoid Robots&#xff09;&#xff1a; 趋势&…

创建 UIKit 项目教程

一、打开 XCode&#xff0c;选择 iOS 下的 App&#xff0c;然后点 Next二、Interface 选择 Storyboard&#xff0c;然后点 Next三、删掉 Main.storyboard四、删掉 SceneDelegate.swift五、AppDelegate.swift 只保留第一个函数六、在 AppDelegate.swift 文件里的 application 函…