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无任何重复,面试直接用!

基础必考题(入门级,必背)

  1. :JVM如何判断对象可回收?为什么不使用引用计数法?
    :采用可达性分析算法,以GC Roots为根节点,遍历引用链,不可达对象判定为可回收;引用计数法无法解决循环引用问题,所以JVM不采用。

  2. :哪些对象可以作为GC Roots?
    :虚拟机栈引用对象、本地方法栈引用对象、类静态属性引用对象、常量引用对象、同步锁持有的对象。

  3. :Java的四种引用类型分别是什么?
    :强引用、软引用、弱引用、虚引用。

进阶高频题(开发级,重点掌握)

  1. :JVM有哪四种垃圾回收算法?实际使用哪种?
    :标记-清除、复制、标记-整理、分代收集;JVM实际使用分代收集算法,新生代用复制算法,老年代用标记-整理算法。

  2. :为什么新生代适合使用复制算法?
    :新生代对象存活时间短、存活率低,复制算法无内存碎片、回收效率高,复制成本低,适合频繁回收。

  3. :CMS收集器的执行流程是什么?有什么缺点?
    :执行流程:初始标记→并发标记→重新标记→并发清除;缺点:产生内存碎片、无法处理浮动垃圾。

原理加分题(面试加分项)

  1. :G1收集器的核心特点是什么?
    :内存分区管理、可预测停顿时间、兼顾吞吐量与延迟,是JDK9及以上版本的默认垃圾收集器。

  2. :吞吐量和停顿时间的区别是什么?
    :吞吐量=运行用户代码的时间/总时间(追求高效利用CPU);停顿时间=GC暂停应用线程的时间(追求减少应用卡顿)。

  3. :老年代为什么不使用复制算法?
    :老年代对象存活率高,若使用复制算法,需要复制大量存活对象,复制成本高,且会浪费一半内存空间,性价比低。

四、今日学习总结

今天是JVM学习的第四天,全程聚焦垃圾回收相关知识点,完全不重复Day3的内容,核心重点是:可达性分析算法、4种垃圾回收算法、主流垃圾收集器,这三块也是JVM面试的高频考点,更是后续内存调优的基础。

建议大家结合原理,重点记忆GC Roots、分代收集算法、CMS和G1收集器的特点,再搭配面试题巩固,新手不用纠结晦涩源码,先吃透这些核心逻辑,就能应对大部分面试场景~

明天我们继续进阶,聚焦JVM内存调优基础,提前预习,一起稳步提升!

(注:文档部分内容可能由 AI 生成)

posted @ 2026-04-24 11:15  白鹿为溪  阅读(4)  评论(0)    收藏  举报