1️⃣ JVM 堆结构回顾
在 HotSpot JVM 的分代内存模型中,堆大致分为:
新生代(Young Generation)
Eden 区
Survivor 区(From/To)
老年代(Old Generation)
方法区 / 元空间(Metaspace)
👉 GC 的不同类型主要是针对这些区域。
2️⃣ Minor GC
触发条件:Eden 区满时触发。
回收范围:新生代(Eden + Survivor)。
特点:
发生频率高(因为对象朝生夕死,Eden 很快满)。
速度快(复制算法 + 新生代对象存活率低)。
不会影响老年代。
流程(复制算法):
存活对象从 Eden + From Survivor 复制到 To Survivor。
Survivor 区不够时,部分对象晋升到老年代。
3️⃣ Major GC(Old GC)
触发条件:
老年代满时触发。
Survivor 区对象晋升失败(老年代空间不足)。
回收范围:老年代。
特点:
发生频率低(老年代对象存活时间长)。
回收速度慢(老年代对象多,使用 标记-清除 / 标记-整理)。
可能会伴随一次 Minor GC(因为要腾出 Survivor 的空间)。
4️⃣ Full GC
触发条件:
调用
System.gc()(只是建议,JVM 可忽略)。老年代空间不足。
方法区 / 元空间不足。
Minor GC 后晋升失败。
回收范围:整个堆(新生代 + 老年代)+ 方法区/元空间。
特点:
最彻底的 GC。
速度最慢,STW(Stop-The-World)时间长。
应该尽量避免频繁发生 Full GC。
5️⃣ 三者对比总结表
GC 类型 回收区域 触发条件 算法 速度 频率 Minor GC 新生代(Eden + Survivor) Eden 满 复制 快 高频 Major GC 老年代 老年代满 / 晋升失败 标记整理 慢 低频 Full GC 整个堆 + 方法区/元空间 System.gc() / 老年代不足 综合 最慢 尽量少
6️⃣ 小结
Minor GC:轻量、频繁、只回收新生代。
Major GC:主要清理老年代,速度比 Minor GC 慢。
Full GC:清理整个堆和方法区,最彻底但最耗时,应避免频繁发生。
⚡ 常见面试题:
👉 "Minor GC 和 Full GC 的区别是什么?"
Minor GC 只清理新生代,发生频繁且速度快;
Full GC 会清理整个堆和方法区,耗时长,应该尽量避免。
面试tips--JVM(4)--Minor GC & Major GC & Full GC
你我约定有三2025-09-03 9:09
相关推荐
云技纵横2 小时前
@Transactional 到底要不要加 rollbackFor?一次数据不一致事故讲清楚Moment2 小时前
牛逼,NextJs 从 16.3 开始全面拥抱 Agent Native 🥰🥰🥰胡萝卜术3 小时前
从“分数打架”到“排名投票”:为什么你的ChatBI必须用RRF?胡萝卜术3 小时前
从暴力到Z字形消元:力扣240「搜索二维矩阵II」的降维打击之路洛卡卡了21 小时前
我们在用 AI 写代码时,为什么建议要好好维护 AGENTS.md 呢?PBitW21 小时前
GPT训练我的第三天,明白了应该咋说满分回答!😕😕😕自由路飞1 天前
RAG 混合检索深挖:BM25 和向量分数为什么不能直接相加?未秃头的程序猿1 天前
告别"if-else地狱"!Java 21模式匹配,代码优雅了10倍阳光是sunny2 天前
Vue 项目怎么做用户行为全链路监控?轻量插件方案详解蝎子莱莱爱打怪2 天前
DSpark 讲透:DeepSeek 不换模型,硬把 V4 提速 85%,是怎么做到的?