标签题目
垃圾回收相关面试题
Java 的 GC 机制是怎样实现的?
这题考察对象存活判定、分代回收、GC 算法和收集器取舍,还会延伸到分配晋升、停顿和 GC 日志排查。
Full GC 的触发原因和主动触发方式有哪些?
考察 JVM 内存压力和 GC 诊断能力,重点是触发原因、显式 GC 风险、不同收集器差异以及如何从日志定位根因。
常见 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 到达的对象判定为存活,不可达对象才有机会被回收。它解决的是对象是否还被程序间接使用的问题。