2025年Java面试宝典下载地址(提取码:9b3g)

垃圾回收机制是如何工作的
Java程序员都知道对象会被自动回收,但面试官最喜欢问具体的回收时机。JVM的垃圾回收(GC)主要看对象的可达性状态。简单来说,当对象没有被任何"活着的"引用链连接到GC Roots时,就会进入可回收状态。
GC Roots包括四类引用:
- 虚拟机栈中引用的对象
- 方法区中类静态属性引用的对象
- 方法区中常量引用的对象
- 本地方法栈JNI引用的对象

判断对象可回收的三个核心条件
1. 引用计数失效
虽然主流的JVM都不采用这种方式,但面试常考。当一个对象的引用计数器归零,说明没有被任何地方引用。但这种方式无法解决循环引用问题,就像两个离婚的人还互相留着结婚证。
2. 可达性分析确认
通过GC Roots遍历对象引用链,所有无法到达的对象会被标记。这个过程需要暂停用户线程(STW),所以优化GC停顿时间是JVM调优的重点。
3. 对象自救的终审机会
即使被标记为不可达,对象还有最后一次复活机会:重写finalize()方法并在其中重新建立引用链。但这个方法实际开发中几乎不用,面试考的是对机制的理解。
分代收集中的区别对待

不同内存区域的对象回收策略不同:
- 新生代:Eden区满触发Minor GC,使用复制算法
- 老年代:空间不足时触发Full GC,使用标记-清除或标记-整理
- 永久代/元空间:存储类元数据,回收条件苛刻
什么时候会真正回收
即使对象被标记为可回收,也不是立即清除。垃圾回收器的运行时机取决于:
- 内存空间紧张程度
- 垃圾收集器类型(如CMS的并发收集)
- System.gc()的调用(不保证立即执行)
建议在开发中避免手动调用System.gc(),容易引发不必要的Full GC影响性能。有程序员朋友在面试中被问到过这个问题,后来发现面试鸭返利网上有详细解析,省去了很多试错时间。
开发中的三点实用建议
- 及时断开强引用(特别是大对象)
- 合理使用软引用/弱引用做缓存
- 避免在循环中创建大量临时对象
如果需要系统复习GC机制,可以参考网盘里的《Java内存模型深度解析》章节。对了,最近发现通过面试鸭返利网购买面试鸭会员能返现25元,对于经常需要刷题的同学来说挺划算的。


