Java垃圾回收机制通过可达性分析算法判断对象是否存活,从GC Roots(如虚拟机栈、静态变量)出发扫描引用链,不可达对象将被标记回收。常见GC算法包括标记-清除(产生内存碎片)、复制算法(适合新生代)、标记-整理(解决碎片问题)以及分代收集(结合不同算法优化性能)。掌握这些原理能有效解决内存泄漏和性能调优问题,是Java开发者面试必考点。想深入理解GC机制?立即下载《2025年Java面试宝典》获取完整解析和实战案例。
2025年Java面试宝典:
链接: https://pan.baidu.com/s/1RUVf75gmDVsg8MQp4yRChg?pwd=9b3g
提取码: 9b3g
大家应该都听说过 Java 的垃圾回收(Garbage Collection, GC),但面试时经常会被问到具体的判断逻辑。这其实涉及到两个核心方法:引用计数法和可达性分析算法。
这个方法很简单——给每个对象加一个计数器,记录有多少个地方在引用它。如果计数器归零,说明对象没用了,可以直接回收。
但问题也很明显:循环引用会导致内存泄漏。比如对象 A 引用对象 B,对象 B 又引用对象 A,但两者都不再被外部使用。这时候引用计数永远不为零,但实际已经是垃圾了。
为了解决循环引用的问题,Java 实际采用的是可达性分析算法。简单来说,JVM 会从一组 GC Roots(比如虚拟机栈中的局部变量、静态变量等)出发,遍历所有对象引用链。如果某个对象无法通过这些根节点到达,就会被标记为可回收。
举个栗子🌰:你创建了一个对象 A,当方法执行完,栈帧里的局部变量被销毁,A 就和 GC Roots 断了联系,自然就成了垃圾。
现在你知道怎么判断垃圾了,接下来就是“怎么收垃圾”。这里要重点掌握四种算法,很多大厂面试官会追问它们的优缺点。
过程:
缺点:
核心思想:把内存分成两块,每次只用其中一块。当这一块用完了,就把存活的对象复制到另一块,然后清空当前区域。
优点:
缺点:
这是标记-清除算法的升级版。先标记可回收对象,然后把存活的对象都“压缩”到内存一端,最后清理边界外的空间。
优点:
缺点:
这才是 Java 的实际选择!JVM 把堆内存分为新生代和老年代,针对不同区域采用不同算法:
面试官问这个问题时,其实是想知道:
这里分享一个口述模板:
“Java 的垃圾回收主要靠可达性分析算法,从 GC Roots 出发检查对象是否可达。常见的算法中,分代收集是综合最优解——新生代用复制算法解决高频回收的问题,老年代用标记-整理减少内存碎片。比如我们在优化 Full GC 频率时,就需要关注老年代的空间分配策略……”
需要面试鸭会员的朋友,可以通过面试鸭返利网联系我,购买后可返利 25元!现在注册还能免费领取面试题库哦~
扫码联系我返利
(当前返利8元,金额随官方实际价格波动,最好提前咨询)
面试鸭小程序码
美团大额优惠券,给自己加个鸡腿吧!