JVM学习第四天:垃圾回收核心原理 + 高频面试题全解(精简博客版)
JVM学习第四天:垃圾回收核心原理 + 高频面试题全解(精简博客版)
哈喽,各位一起学JVM的小伙伴~ 今天是JVM学习的第四天,承接第三天的基础(Day3:JVM架构、内存区域、对象创建、类加载),今天我们全程聚焦全新知识点,不重复、不冗余,只讲垃圾回收核心原理、实用算法、主流收集器,搭配专属高频面试题,新手能吃透原理,备考同学可直接背诵,兼顾理解与面试落地!
一、今日核心学习目标
-
掌握JVM对象可回收的判定标准,吃透GC Roots核心逻辑
-
理解4种经典垃圾回收算法的原理、优缺点及适用场景
-
熟悉主流垃圾收集器的分类、工作机制与应用场景
-
熟记Day4专属高频面试题,轻松应对面试痛点
二、核心原理精讲(面试必考)
2.1 对象回收判定机制(GC的核心前提)
JVM要回收垃圾,首先得判断“哪些对象是无用的”,核心有两种判定方式,重点掌握第二种:
1. 引用计数法(JVM不采用)
原理很简单:给每个对象添加一个引用计数器,有地方引用该对象,计数器就+1;引用释放,计数器就-1;当计数器的值为0时,就判定为可回收对象。
缺陷:无法解决循环引用问题(比如A引用B,B引用A,两者都无其他引用,计数器都不为0,无法回收,导致内存泄漏),所以JVM不使用这种方式。
2. 可达性分析算法(JVM默认标准)
这是JVM实际使用的判定方式,核心逻辑:以GC Roots为根节点,向下遍历引用链,若某个对象无法通过任何引用链到达GC Roots,就判定为可回收对象。
重点记:可作为GC Roots的5种对象(面试必背):
-
虚拟机栈中引用的对象(比如方法内的局部变量)
-
本地方法栈中引用的对象(native方法调用的对象)
-
类静态属性引用的对象(比如static修饰的对象)
-
常量引用的对象(比如String常量池中的对象)
-
同步锁(synchronized)持有的对象
3. Java四种引用类型(补充考点)
不同引用类型,决定了对象的回收优先级,面试常考,简单记:
-
强引用:普通引用(比如new Object()),GC绝不回收,哪怕内存不足也会抛出OOM
-
软引用:内存不足时才会回收,适合做缓存(比如图片缓存)
-
弱引用:下次GC一定会回收,生命周期很短
-
虚引用:完全不影响对象生命周期,仅用于接收GC回收通知
2.2 垃圾回收算法(面试高频,必吃透)
判定出可回收对象后,JVM如何高效回收?这就需要垃圾回收算法,核心4种,重点掌握适用场景:
1. 标记-清除算法(最基础)
流程:先遍历所有对象,标记出可回收对象 → 再统一清除所有标记的对象。
优点:实现简单,无需额外内存空间
缺点:会产生内存碎片(清除后内存不连续),后续分配大对象时可能无法找到足够连续内存,触发GC。
2. 复制算法(新生代专用)
流程:将内存划分为大小相等的两块,每次只使用其中一块;GC时,将存活对象复制到另一块内存,然后清空原内存区域。
优点:无内存碎片,回收效率高(只复制存活对象)
缺点:内存利用率低,仅能使用一半内存
适用场景:新生代(对象存活时间短、存活率低,复制成本低)
3. 标记-整理算法(老年代专用)
流程:先标记存活对象 → 再将所有存活对象向内存一端移动,最后清除端外的可回收对象。
优点:无内存碎片,内存利用率高
适用场景:老年代(对象存活时间长、存活率高,移动成本可接受)
4. 分代收集算法(JVM实际使用)
这不是独立算法,而是结合前面三种算法的实战方案,核心依据:对象存活时间不同,放在不同内存区域,采用不同算法。
-
新生代:对象存活时间短 → 复制算法
-
老年代:对象存活时间长 → 标记-整理算法(或标记-清除算法)
2.3 垃圾收集器(JVM的“垃圾回收执行者”)
垃圾回收算法是“理论”,垃圾收集器是“实现”,JVM提供了多种收集器,按回收区域分为新生代、老年代,重点记常用的:
1. 新生代收集器
-
Serial:单线程收集,简单高效,适合客户端(比如桌面应用)
-
ParNew:Serial的多线程版本,效率更高,常与CMS收集器搭配使用
-
Parallel Scavenge:多线程收集,重点关注吞吐量(CPU利用率),适合服务端批量处理场景
2. 老年代收集器
-
Serial Old:Serial的老年代版本,单线程,标记-整理算法
-
Parallel Old:Parallel Scavenge的老年代版本,多线程,高吞吐量
-
CMS(Concurrent Mark Sweep):并发收集,重点追求低停顿(减少应用卡顿),适合对响应速度要求高的场景(比如Web应用)
-
执行流程:初始标记 → 并发标记 → 重新标记 → 并发清除
-
缺点:会产生内存碎片,无法处理“浮动垃圾”(GC过程中产生的新垃圾)
-
3. G1收集器(JDK9+默认)
面向服务端的收集器,兼顾吞吐量与低停顿,核心特点:
-
将内存划分为多个大小相等的Region(区域),按优先级回收垃圾
-
可预测停顿时间(提前设置GC停顿阈值)
-
无需区分新生代和老年代,可同时回收两个区域
三、Day4 高频面试题(含标准答案,直接背诵)
全部是Day4专属考点,与Day3无任何重复,面试直接用!
基础必考题(入门级,必背)
-
问:JVM如何判断对象可回收?为什么不使用引用计数法?
答:采用可达性分析算法,以GC Roots为根节点,遍历引用链,不可达对象判定为可回收;引用计数法无法解决循环引用问题,所以JVM不采用。 -
问:哪些对象可以作为GC Roots?
答:虚拟机栈引用对象、本地方法栈引用对象、类静态属性引用对象、常量引用对象、同步锁持有的对象。 -
问:Java的四种引用类型分别是什么?
答:强引用、软引用、弱引用、虚引用。
进阶高频题(开发级,重点掌握)
-
问:JVM有哪四种垃圾回收算法?实际使用哪种?
答:标记-清除、复制、标记-整理、分代收集;JVM实际使用分代收集算法,新生代用复制算法,老年代用标记-整理算法。 -
问:为什么新生代适合使用复制算法?
答:新生代对象存活时间短、存活率低,复制算法无内存碎片、回收效率高,复制成本低,适合频繁回收。 -
问:CMS收集器的执行流程是什么?有什么缺点?
答:执行流程:初始标记→并发标记→重新标记→并发清除;缺点:产生内存碎片、无法处理浮动垃圾。
原理加分题(面试加分项)
-
问:G1收集器的核心特点是什么?
答:内存分区管理、可预测停顿时间、兼顾吞吐量与延迟,是JDK9及以上版本的默认垃圾收集器。 -
问:吞吐量和停顿时间的区别是什么?
答:吞吐量=运行用户代码的时间/总时间(追求高效利用CPU);停顿时间=GC暂停应用线程的时间(追求减少应用卡顿)。 -
问:老年代为什么不使用复制算法?
答:老年代对象存活率高,若使用复制算法,需要复制大量存活对象,复制成本高,且会浪费一半内存空间,性价比低。
四、今日学习总结
今天是JVM学习的第四天,全程聚焦垃圾回收相关知识点,完全不重复Day3的内容,核心重点是:可达性分析算法、4种垃圾回收算法、主流垃圾收集器,这三块也是JVM面试的高频考点,更是后续内存调优的基础。
建议大家结合原理,重点记忆GC Roots、分代收集算法、CMS和G1收集器的特点,再搭配面试题巩固,新手不用纠结晦涩源码,先吃透这些核心逻辑,就能应对大部分面试场景~
明天我们继续进阶,聚焦JVM内存调优基础,提前预习,一起稳步提升!
(注:文档部分内容可能由 AI 生成)

浙公网安备 33010602011771号