知识点标签

垃圾回收面试题解析

垃圾回收相关面试题解析,按真实面经题目沉淀核心机制、易错点和面试官追问。

9 道题 1 个岗位 4 个公司

垃圾回收相关面试题

常见 JVM 垃圾收集器分别适合什么场景?

垃圾回收器适用场景不能只背名称,而要围绕吞吐量、停顿时间、堆大小、对象生命周期、CPU 余量和运行时版本来选择。Serial 适合小堆和低资源环境,Parallel 适合吞吐优先任务,CMS 是旧版本低停顿方案但有碎片和并发失败风险,G1 是较新主流服务端的平衡型选择,ZGC 与 Shenandoah 面向更严苛的低停顿和大堆场景,Epsilon 只适合测试、压测和短生命周期实验。

JVM 堆内存通常如何分区?

JVM 堆可以从两条线理解:按对象生命周期分为年轻代和老年代,年轻代内部又分 Eden 和两个 Survivor;按具体垃圾收集器实现,传统分代收集器更强调连续代空间,G1、ZGC、Shenandoah 等更强调 region 或分区化管理。回答时要特别说明:元空间和线程栈不属于堆,TLAB 是 Eden 中给线程预分配的私有分配缓冲区,大对象可能直接进入老年代或被特殊 region 管理。

JVM 垃圾回收机制是什么?

JVM 垃圾回收机制的核心,是 JVM 自动识别已经不可达的对象并回收其占用的内存,从而降低手动释放内存的负担。面试回答要先明确:GC 主要发生在 Java 堆,尤其是新生代;同时也要补充方法区或元空间在类卸载、常量废弃时也可能被回收,但虚拟机栈、本地方法栈和程序计数器通常随线程或栈帧生命周期自动释放,不是 GC 的主要战场。

JVM中的【堆】是用什么数据结构来实现的?

JVM 中的堆不是二叉堆、最大堆、最小堆这种数据结构,而是 JVM 运行时用于存放对象实例和数组的一块共享内存区域。它的具体组织方式取决于垃圾收集器:可能按年轻代、老年代划分,也可能按 Region 管理;对象分配通常依赖 TLAB、指针碰撞、空闲列表等机制,而对象回收依赖可达性分析和 GC 元数据。

JVM 运行时内存区域如何划分?

JVM 运行时内存区域可以按线程私有和线程共享来划分:程序计数器、虚拟机栈、本地方法栈属于线程私有;堆和方法区属于线程共享。面试回答不能只背名称,还要说明每块区域存什么、生命周期如何、会抛什么错误、和垃圾回收的关系,以及 JDK 8 以后永久代被元空间替代这一常见边界。

JVM 如何判断对象可以被回收,分代收集如何工作?

这道题核心不是背垃圾收集器名称,而是说明 JVM 如何从“对象是否还可被程序使用”推导出“是否可回收”,再解释为什么堆会按年轻代和老年代组织。回答时要把可达性分析、GC Roots、引用强度、finalize 的特殊边界,以及 Minor GC、Major GC、Full GC、对象晋升和跨代引用处理串成一条完整链路。

简介 JVM 的可达性分析过程?

简介 JVM 的可达性分析过程?这道腾讯牛客题的关键是围绕“JVM 可达性分析”讲清概念、机制、取舍和边界。JVM 可达性分析从一组 GC Roots 出发,沿对象引用关系遍历对象图;能从 Roots 到达的对象判定为存活,不可达对象才有机会被回收。它解决的是对象是否还被程序间接使用的问题。