java垃圾收集 minorgc majargc fullgc

核心概念总览

这三种 GC 类型的本质区别在于回收的堆内存区域触发原因

GC 类型别名回收区域触发原因特点
Minor GCYoung GC只回收年轻代(Eden + Survivor)Eden 区空间不足非常频繁,速度通常很快,使用复制算法
Major GCOld GC只回收老年代老年代空间不足或达到特定条件通常比 Minor GC 慢,但比 Full GC 快,取决于具体GC器
Full GC-回收整个堆(年轻代 + 老年代 + 方法区/元空间)多种原因(见下文)STW时间最长,对性能影响最大,应尽量避免

1. Minor GC (Young GC)

触发时机:当JVM 无法在 Eden 区为新创建的对象分配内存时,便会触发一次 Minor GC。

过程(以最常见的复制算法为例)

  1. 标记:从 GC Roots 开始,标记出 Eden 区和其中一个 Survivor区(From Survivor)中所有存活的对象
  2. 复制清除
    • 将所有存活的对象复制到另一个空的 Survivor 区(To Survivor)。
    • 存活对象的年龄(Age)会加 1。每经历一次 Minor GC 且存活下来,年龄就增加 1。
    • 如果某个对象的年龄超过阈值(默认15,可通过-XX:MaxTenuringThreshold设置),或者 To Survivor 区空间不足,这些对象会被晋升(Promotion)到老年代。
  3. 清理:直接清空整个 Eden 区和刚才使用的 From Survivor 区。这些区域现在变为空闲状态。

特点

  • 频繁:因为新对象创建和消亡非常快。
  • 速度快:只处理年轻代,大部分对象都是“朝生夕死”,需要复制的存活对象很少。
  • 会发生 STW (Stop-The-World):但通常停顿时间极短,用户无感知。

2. Major GC (Old GC)

触发时机

  • 老年代空间不足。
  • 分代收集器(如 CMS)中,当老年代的使用率达到某个阈值(如-XX:CMSInitiatingOccupancyFraction,默认92%)时触发。
  • G1 收集器中,与之对应的概念是Mixed GC(混合收集),它不仅回收年轻代,也会回收一部分老年代区域。

特点

  • 老年代的对象存活率通常很高,所以标记和清理的过程比 Minor GC 更耗时。
  • “Major GC”这个术语定义比较模糊。有时它特指只清理老年代的 GC(如 CMS 的并发收集),但有时也有人用它来指代 Full GC。需要根据上下文区分。

3. Full GC

Full GC 是 JVM 中最重量级的垃圾收集,会对整个堆内存和方法区(元空间)进行清理。

触发时机(常见原因)

  1. 老年代空间不足:尝试进行 Major GC 后,空间仍然不足,则会触发 Full GC。
  2. 方法区(元空间)空间不足
  3. System.gc() 调用:建议 JVM 进行 Full GC,但 JVM 不一定会执行(可通过-XX:+DisableExplicitGC禁用此调用)。
  4. 空间分配担保失败
    • 在发生 Minor GC 之前,JVM 会检查老年代最大可用连续空间是否大于年轻代所有对象总空间
    • 如果大于,则说明 Minor GC 是安全的(即使所有年轻代对象都晋升,老年代也放得下)。
    • 如果小于,JVM 会检查是否设置了-XX:-HandlePromotionFailure(JDK 6 Update 24 之后废弃,规则变为永远担保)。
    • 如果担保失败,则会先触发一次 Full GC 来腾挪老年代空间,然后再进行 Minor GC。
  5. 堆内存中产生大量内存碎片,导致无法为大对象找到足够的连续空间。

特点

  • STW 时间最长,对应用程序性能影响巨大,是调优的主要规避对象。
  • Serial、Parallel Scavenge等收集器中,Full GC 是单线程的,效率极低。
  • 无论是哪种 GC 器,Full GC 都是需要全力避免的情况。

它们之间的关系与工作流程

一个对象的“一生”和 GC 的关系可以概括为以下流程:

flowchart TD
A[新对象尝试在Eden区分配] --> B{Eden区空间足够?}
B – 是 --> C[分配成功]
B – 否 --> D[触发Minor GC]

D --> E{对象在Minor GC中存活?}
E – 否 --> F[被回收]
E – 是 --> G[年龄加1, 移入Survivor区]

G --> H{对象年龄超过阈值
或Survivor空间不足?}
H – 否 --> A
H – 是 --> I[晋升到老年代]

I --> J[老年代对象堆积]

J --> K{老年代空间不足?}
K – 是 --> L[触发Major GC或Full GC]

L --> M{GC后空间足够?}
M – 是 --> I
M – 否 --> N[抛出OutOfMemoryError]

如何监控和排查?

  1. 命令行工具

    • jstat -gc <pid>:查看堆内存各分代容量和GC次数、时间。
    • jstat -gccause <pid>:查看上次GC的原因。
  2. GC 日志:这是最强大的工具。添加以下JVM参数开启详细日志:

    -XX:+PrintGC
    -XX:+PrintGCDetails
    -XX:+PrintGCDateStamps
    -Xloggc:/path/to/gc.log

    在日志中,PSYoungGen代表 Parallel Scavenge 收集器的年轻代GC(Minor GC),ParOldGen代表老年代GC(Major GC),Full GC会明确写出。

总结

  • Minor GC:日常操作,回收年轻代,快。
  • Major GC:重点关照,回收老年代,慢。
  • Full GC:紧急事故,全堆回收,非常慢,必须避免

优化的核心目标就是:减少 Full GC 的发生频率,缩短 STW 时间。通过调整堆大小、分代比例、选择合适GC器(如G1、ZGC)等手段,让对象尽可能在 Minor GC 阶段就被清理掉,减少不必要的晋升,并保证老年代有足够的空间。

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

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

相关文章

基于RK3399Pro与RK3568的车载防撞方案:为货车泥头车安全护航

rk3399pro&#xff0c;rk3568&#xff0c;车载方案设计&#xff0c;4路AHD-1080P摄像头输入&#xff0c;防撞识别&#xff0c;助力货车泥头车安全运输&#xff01;在货运行业中&#xff0c;货车与泥头车的安全运输至关重要。今天咱就聊聊基于RK3399Pro和RK3568芯片的车载方案设…

超详细逻辑回归解说

逻辑回归是用来做“分类”的模型&#xff08;比如判断“是不是垃圾邮件”“病人有没有患病”“用户会不会点击广告”&#xff09;&#xff0c;而非回归。它的核心是&#xff1a;用“概率”的方式&#xff0c;把线性回归的输出&#xff08;连续值&#xff09;转化为“是/否”的分…

超声波传感器(HC-SR04)与Arduino Uno及Mixly使用

【结合AI智能体学习记录】一、&#xff08;HC-SR04&#xff09;超声波传感器工作原理&#xff1a;超声波传感器和蝙蝠的定位原理一致&#xff0c;核心是通过计算超声波往返时间来换算距离&#xff1a;1. 触发发射&#xff1a;模块的Trig引脚接收到高电平信号后&#xff0c;会自…

学霸同款2026TOP10AI论文网站:本科生毕业论文神器测评

学霸同款2026TOP10AI论文网站&#xff1a;本科生毕业论文神器测评 2026年学术写作工具测评&#xff1a;为何需要这份榜单&#xff1f; 随着人工智能技术的不断进步&#xff0c;AI论文网站逐渐成为高校学生和研究人员的重要辅助工具。然而&#xff0c;面对市场上琳琅满目的选择&…

react组件内添加一个全局点击时间,点击函数能区分是否是某个特定的id的dom触发的

在 React 组件内添加一个全局点击事件&#xff0c;并判断是否是某个特定 id 的 DOM 触发&#xff0c;可以这样实现&#xff1a; 实现思路 在组件 mount 时&#xff08;useEffect&#xff09;&#xff0c;用 document.addEventListener 注册全局点击事件。回调函数中通过 event.…

.NET 某RFID标签打印客户端 崩溃分析

崩溃分析1. 为什么会崩溃双击打开dump&#xff0c;windbg会自动定位到崩溃的上下文&#xff0c;这一点我比较喜欢&#xff0c;有的时候也省去了用 !analyze -v 无趣的等待&#xff0c;参考输出如下&#xff1a;This dump file has an exception of interest stored in it. The …

游戏打不开、程序闪退怎么办?有效的DLL修复工具推荐,一键拯救你的电脑

“由于找不到MSVCP140.dll&#xff0c;无法继续执行代码。”“应用程序无法正常启动(0xc000007b)。”相信许多电脑用户都遇到过类似的弹窗警告&#xff0c;尤其是在运行新安装的游戏或专业软件时。这些令人头疼的问题&#xff0c;十有八九都指向同一个“元凶”——C运行库的缺失…

风光柴储多目标联合调度问题探索

风光柴储多目标联合调度问题 联合调度分析各部分消纳比例&#xff0c;目标各部分成本最小和排放最小。 约束各部荷电状态&#xff0c;功率平衡等等在当今能源转型的大背景下&#xff0c;风光柴储多目标联合调度成为了热门话题。这种联合调度旨在实现能源的高效利用&#xff0c;…

实体门店新纪元:从“单点AI尝试”到“系统智能体”的转型之路

近两年来&#xff0c;实体经营领域普遍感受到一种“矛盾现象”&#xff1a;技术在不断升级&#xff0c;设备在持续更新&#xff0c;AI话题也频繁出现在各类讨论中&#xff0c;然而&#xff0c;许多门店的经营压力并未因此减轻&#xff0c;反而呈现出更加复杂的挑战。客流获取成…

Oracle 高风险锁等待快速诊断手册

一、手册使用说明1.1 适用场景生产库出现会话阻塞、业务卡顿、事务超时监控工具&#xff08;如OEM、Zabbix&#xff09;告警“锁等待次数突增”“Concurrency等待占比超20%”出现高风险锁事件&#xff08;如enq: CI - contention、enq: TX - allocate ITL entry&#xff09;1.2…

从“经验驱动”到“系统智能”:实体门店经营的结构性升级

当前实体经营领域&#xff0c;普遍存在一个深层挑战&#xff1a;许多门店尽管在工具、设备乃至营销手段上不断更新&#xff0c;但其核心经营逻辑仍停留在较为传统的模式。获客依赖广告与促销&#xff0c;服务依靠人员经验与话术&#xff0c;客户离店后关系难以持续&#xff0c;…

UVM-phase中的object机制

在class uvm_phase extends uvm_object中1. 类的作用和结构这个类是 uvm_phase&#xff0c;它管理测试平台中阶段的 objection 机制。UVM 使用 objection 机制来控制仿真的执行时间&#xff0c;防止测试提前结束。核心成员&#xff1a;systemveriloguvm_objection phase_done; …

AI+IoT双轮驱动:构建风电设备预测性维护数字孪生体的全栈技术实践

凌晨三点&#xff0c;内蒙古某大型风电场运维主管王工接到SCADA系统告警&#xff1a;“#23风机异常停机”。他迅速调取振动频谱图&#xff0c;却发现数据杂乱无章——是主轴承即将失效&#xff1f;还是传感器松动导致误报&#xff1f;抑或只是电网波动引发的瞬时保护动作&#…

UE5 C++(7):

&#xff08;31&#xff09; &#xff08;32&#xff09; 谢谢

企业落地 ChatBI,如何构建可信可靠的数据底座?

在企业 ChatBI 落地过程中&#xff0c;数据底座的技术路线选择直接决定了数据可信度、维护成本和业务响应速度。传统宽表架构在数据口径一致性、维护成本和灵活性上已难以支撑企业级 ChatBI 的规模化应用&#xff0c;而基于 NoETL 明细语义层的方案正成为新一代数据底座的主流选…

亲测好用8个AI论文写作软件,本科生搞定论文不求人!

亲测好用8个AI论文写作软件&#xff0c;本科生搞定论文不求人&#xff01; AI 工具如何让论文写作变得轻松高效 在当今这个信息爆炸的时代&#xff0c;本科生的论文写作任务日益繁重&#xff0c;尤其是在面对大量文献阅读、数据分析和文字表达时&#xff0c;许多同学都会感到力…

UE5 C++(6-2):描述角色 EndPlay 原因的枚举类 EEndPlayReason::Type,此命名空间里定义了一个枚举类。

&#xff08;30&#xff09;描述角色 EndPlay 原因的枚举类 EEndPlayReason::Type &#xff1a;&#xff08;31&#xff09; 谢谢

基于IEEE33节点配电网的分布式电源与电动汽车接入潮流计算研究:考虑风光时序特性与电动汽车出...

含分布式电源和电动汽车的配电网潮流计算 考虑风光以及电动汽车的出力时序特性 建立风光电动汽车接入的潮流模型 基于IEEE33节点配电网&#xff0c;采用牛拉法求解得到接入之后的潮流分布。引言 随着可再生能源与新型用电负荷的快速发展&#xff0c;现代配电网正经历从“被动”…

双馈风力发电机直接功率控制的Simulink Matlab模型探索

双馈风力发电机直接功率控制simulink Matlab模型 采用直接功率控制的矢量控制策略在风力发电领域&#xff0c;双馈风力发电机&#xff08;DFIG&#xff09;因其独特的优势被广泛应用。而直接功率控制&#xff08;DPC&#xff09;作为一种高效的控制策略&#xff0c;为DFIG的稳定…

【珍藏干货】零成本打造智能文档问答系统!Everything plus RAG实战:让AI帮你从海量文档中精准找答案

本文介绍了一个基于RAG技术的开源智能文档问答系统"Everything plus"&#xff0c;结合BM25关键词检索与向量检索技术&#xff0c;实现从海量文档中精准查找答案。系统采用三层架构&#xff0c;支持30种文件类型扫描&#xff0c;包含混合检索、RRF融合算法、查询重写和…