JVM 垃圾回收过程和核心机制是什么?
未标记
考查重点:对象可达性、回收方式与停顿。GC从根对象追踪可达对象,再按收集器执行标记、复制或整理;分代利用对象寿命差异,说明哪些阶段会暂停业务线程
本题目录
参考答案
本答案基于相关资料,由 AI 辅助编写,供学习与面试准备参考。如有疏漏,欢迎反馈指正。
核心回答
JVM 垃圾回收主要完成三件事:判断对象是否仍被需要、选择回收范围、回收并整理内存。HotSpot 通常从 GC Roots 出发做可达性分析;无法通过相关引用链到达的对象才可能被回收,不是看到两个对象互相引用就认定存活。
回收时可采用标记清除、复制或标记整理,并按对象寿命与收集器设计组织分代或分区。部分阶段需要暂停应用线程(STW),部分工作可与应用并发。具体过程取决于JDK版本和收集器,不能把一个固定“Minor GC→Full GC”顺序当作全部JVM的共同流程。
各机制怎样配合
GC Roots包括栈中活跃引用、相关静态引用和JNI引用等。应用运行时引用还会变化,并发收集器需要写屏障、记忆集等机制追踪变化,保证标记与回收正确;这些机制会带来额外CPU和内存成本。
标记清除直接释放不可达对象空间,但可能留下碎片;复制把存活对象搬到其他空间,便于连续分配,但需要目标空间;标记整理移动存活对象,减少碎片,也有移动和更新引用的开销。
分代利用“多数对象寿命短”的经验,让年轻代回收不必每次扫描整个堆。以JDK21的G1为例,堆划成Region,年轻代和老年代是逻辑角色;回收选定区域时转移存活对象,整堆标记的一部分可与应用并发,关键阶段仍有STW。
追问
- 为什么不能完全没有暂停? 收集器需要在某些阶段建立一致的观察点或完成引用处理;低延迟收集器缩短暂停,不代表完全不暂停。
GC后还有OOM? 可能是存活对象过多、内存泄漏、分配速度过快、堆或其他内存区域不足,应结合日志、分配率和对象保留路径定位。- 自动
GC能替代关闭文件吗? 不能。文件、连接和锁应按资源生命周期及时释放,不能依赖对象何时被回收。
参考资料
- 国内:JavaGuide / Snailclimb:JVM 垃圾回收详解:借鉴可达性与复制、清除、整理的比较,组织正文中从存活判断到空间回收的主线。
- 国内:JavaGuide / Snailclimb:Java 内存区域详解:参考运行时内存区域,区分正文中堆对象回收、栈帧退出与元空间问题。
- 国内:说出你的愿望吧丷 / JavaGuide收录:大白话带你认识JVM:参考类加载到执行的简介,交代正文中 GC 在 JVM 执行和存储管理中的职责。
- 国外:Oracle:Garbage-First (G1) Garbage Collector — JDK 21:G1的分区、转移和并发标记解释分代并不等于固定连续内存布局,暂停目标也不是硬实时保证。
- 国外:Oracle:JVM Specification SE21 — Runtime Data Areas:堆与自动存储管理的规范说明GC算法属于具体虚拟机实现,而非所有JVM必须采用同一流程。


