2025年Java面试宝典下载链接(提取码:9b3g)
JVM垃圾回收机制的核心原理
在面试中问到JVM垃圾回收机制时,要重点讲清楚"判断对象存活"和"回收策略"两个核心点。JVM通过可达性分析算法判断对象是否存活,从GC Roots(如虚拟机栈、方法区静态变量等)出发,遍历引用链。未被引用的对象会被标记为可回收对象。

常见的垃圾回收算法
标记-清除算法
这是最基础的垃圾回收算法,分为标记阶段(标记存活对象)和清除阶段(回收未标记对象)。但会产生内存碎片,影响大对象的内存分配效率。
复制算法
将内存分为两块,每次只使用其中一块。垃圾回收时把存活对象复制到另一块内存,直接清空当前内存。适合存活率低的场景(如新生代),但内存利用率只有50%。
标记-整理算法
在标记-清除的基础上增加整理阶段,让所有存活对象向内存一端移动。解决了内存碎片问题,但整理过程需要暂停用户线程(Stop The World)。

分代收集算法的实现策略
实际JVM中多采用分代收集算法,根据对象存活周期将堆内存划分为:
- 新生代:存放新创建对象,使用复制算法(默认比例Eden:S0:S1=8:1:1)
- 老年代:存放长期存活对象,使用标记-清除或标记-整理算法
- 永久代/元空间:存放类元数据(JDK8后改为元空间)
在面试中要能说清楚Young GC和Full GC的区别:Young GC只清理新生代,停顿时间短;Full GC会清理整个堆,停顿时间长,需要尽量避免。
垃圾收集器的选择与调优
常见的垃圾收集器组合:
- ParNew + CMS:追求低延迟的响应式系统
- G1:兼顾吞吐量和延迟的通用型收集器
- ZGC:超大堆内存(TB级别)场景
调优时需要关注的关键参数:
-Xmx/-Xms堆内存最大值/初始值-XX:NewRatio新生代与老年代比例-XX:SurvivorRatioEden与Survivor区比例

高频面试问题解析
-
对象什么时候进入老年代?
除了年龄达到阈值(默认15),大对象会直接进入老年代,Survivor区放不下的对象也会提前晋升。 -
CMS收集器的工作流程?
初始标记(STW)→并发标记→重新标记(STW)→并发清除,其中耗时最长的并发标记阶段可以与用户线程并行。 -
如何避免Full GC?
主要从以下方面入手:
- 合理设置新生代大小避免过早晋升
- 避免显示调用System.gc()
- 使用CMS时配置
-XX:CMSInitiatingOccupancyFraction触发阈值
需要更多面试真题训练的同学,可以通过面试鸭返利网获取最新题库,购买会员时使用返利链接可立减25元。本文开头的网盘链接整理了近三年大厂真题,建议下载后结合具体场景理解垃圾回收机制。


