news 2026/4/16 18:06:49

java垃圾收集 minorgc majargc fullgc

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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 阶段就被清理掉,减少不必要的晋升,并保证老年代有足够的空间。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 16:07:57

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

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

作者头像 李华
网站建设 2026/4/16 14:06:18

一站式办公平台 vs 单一即时通讯软件:企业该如何抉择?

在数字化转型的十字路口&#xff0c;企业管理者和IT负责人往往面临一个经典的选型难题&#xff1a; “我们是应该购买一个包罗万象的‘一站式办公平台’&#xff0c;还是选择一个专注极致沟通的‘单一即时通讯软件’&#xff1f;” 前者似乎能解决所有问题&#xff0c;但往往…

作者头像 李华
网站建设 2026/4/16 12:47:15

TOON:一种为大模型设计的JSON压缩型数据结构

目录 TOON&#xff1a;一种为大模型设计的JSON压缩型数据结构 一、精准定义&#xff0c;什么是 TOON&#xff1f; 1、JSON 数据格式的局限性 2、TOON 的结构与优势 3、TOON 数据结构的主要特征 4、媒体类型与文件拓展名 二、举例&#xff1a;JSON 与 TOON 描述同一组数据…

作者头像 李华
网站建设 2026/4/16 11:36:52

百考通AI:源码宝库+智能答辩,毕业季的终极“外挂”

作为一名计算机专业的学生或开发者&#xff0c;你是否经常在这样的场景中挣扎&#xff1a;毕业设计截止日期临近&#xff0c;却苦于找不到合适的项目源码作为参考&#xff1b;答辩在即&#xff0c;却要花费大量时间熬夜制作PPT。这种“白天敲代码&#xff0c;晚上做PPT”的高强…

作者头像 李华
网站建设 2026/4/11 18:39:38

深度学习赋能学术写作:百考通AI如何重塑科研全流程体验

深夜的实验室&#xff0c;只有键盘敲击声与偶尔的叹息交织。屏幕上的文献密密麻麻&#xff0c;而文档里的字数增长缓慢。这可能是许多科研工作者与学生再熟悉不过的场景。 从选题的迷茫、文献的浩瀚、撰写的艰辛&#xff0c;到降重的烦恼、格式的繁琐——学术写作是一条充满挑…

作者头像 李华