【JVM】从堆、栈到 GC 垃圾回收器,后端面试核心知识点全梳理

发布时间:2026/10/14 4:50:50

【JVM】从堆、栈到 GC 垃圾回收器,后端面试核心知识点全梳理 前言Java 最核心的特性一次编译到处运行底层就是 JVMJava Virtual MachineJava 虚拟机。 我们写的.java源码编译成.class字节码JVM 加载字节码解释 / 编译执行。JVM 屏蔽了操作系统底层差异。学习 JVM两大核心板块内存模型运行时数据区重点搞懂虚拟机栈、堆GC 垃圾回收什么时候回收、回收什么对象、用什么收集器回收重要区分JVM 内存 ≠ 操作系统内存GC 只回收堆内存中的对象栈不存在 GC。一、JVM 运行时数据区JVM 在执行 Java 程序时会把管理的内存划分为若干不同区域部分区域随 JVM 启动创建JVM 退出销毁部分区域线程私有随线程创建销毁。线程私有区域每个线程独立一份互不共享虚拟机栈Java 栈本地方法栈程序计数器线程共享区域整个 JVM 一份所有线程共享堆Heap【GC 主战场】方法区元空间 MetaSpaceJDK8✅ 一句话区分私有 / 共享线程私有线程生则生、线程亡则释放共享区域由 JVM 统一管理涉及 GC。1. 虚拟机栈重点栈存放局部变量、方法调用栈帧每个 Java 方法执行时都会创建一个栈帧 (Stack Frame)压入虚拟机栈方法执行结束栈帧出栈销毁。栈帧包含局部变量表、操作数栈、动态链接、方法返回地址。局部变量表存放基本数据类型int/boolean/long、对象引用地址不是对象本身对象本体在堆。栈上存的是对象引用对象实例本身一定在堆。栈的异常StackOverflowError栈深度超过上限无限递归OutOfMemoryError不断创建线程耗尽操作系统内存线程栈分配内存失败栈内存没有 GC方法执行完毕栈帧自动弹出释放不需要垃圾回收。2. 程序计数器当前线程执行字节码的行号指示器。记录当前执行到哪一行指令。 唯一一个没有 OOM的区域。3. 本地方法栈和虚拟机栈作用几乎一致区别是为native 本地方法C/C 写的方法服务。4. 堆 Heap重中之重GC 发生在这里堆存放所有对象实例 数组JVM 最大一块内存所有线程共享GC 主要回收区域。JDK8 堆结构划分新生代Young Generation新创建对象绝大多数对象朝生夕灭。Eden 区对象诞生地占新生代 80%Survivor0S0From、Survivor1S1To各占 10%同一时间只有一块 Survivor 是可用的另一块是空的复制算法。老年代Old Generation存活时间久、大对象。多次 GC 存活的对象晋升到老年代。对象晋升规则对象在新生代熬过多次 GC默认 15 次晋升到老年代超大对象直接进入老年代避免 Eden 复制开销。堆会发生 OOMjava.lang.OutOfMemoryError: Java heap space堆内存不足。5. 方法区JDK1.8 之后叫元空间 MetaSpace存放类的结构信息、常量、静态变量、即时编译器编译后的代码。JDK1.7 及之前永久代PermGen属于堆内存一部分容易 OOM JDK8移除永久代改为元空间使用操作系统本地内存不再占用堆内存。二、栈和堆核心对比面试必问表格对比项虚拟机栈堆 Heap归属线程私有每个线程独立栈线程共享全局唯一堆存储内容栈帧、局部变量、对象引用地址对象实例、数组内存回收自动出栈销毁无 GC由 GC 垃圾收集器回收废弃对象大小固定栈深度一般不大JVM 最大内存区域可通过 - Xmx -Xms 设置OOM 类型StackOverflowError / OOM创建过多线程OOM: Java heap space生命周期跟随线程跟随 JVM高频误区纠正 ❌ 错误说法对象存在栈里。 ✅ 正确对象实例一定在堆栈里面只保存对象的引用地址。 JDK 有逃逸分析满足条件的小对象会发生栈上分配属于优化不是默认行为。面试没特别问逃逸分析优先按基础结论作答。三、垃圾回收 GC 基础理论GC 目标回收堆中不再被引用的对象释放内存。1. 如何判断对象是否可以回收引用计数法对象被引用 1引用消失 - 1计数 0 则可回收。 缺点循环引用无法识别JVM 没有采用。可达性分析算法JVM 采用以GC Roots作为起始根节点向下搜索引用链。不能到达的对象判定为垃圾可以回收。GC Roots 包含虚拟机栈中局部变量引用的对象方法区静态变量引用对象本地方法栈 native 引用对象锁持有的对象即使对象不可达也不是立刻死亡会执行一次 finalize ()基本不推荐使用该方法不可靠。2. 三大基础垃圾回收算法标记 - 清除Mark-Sweep标记垃圾统一清除。缺点内存碎片分配大对象容易 OOM。复制算法Copying新生代使用。Eden Survivor存活对象复制到空白 Survivor清空原区域。无碎片代价是占用双倍内存。标记 - 整理Mark-Compact老年代使用。标记垃圾清除后存活对象向一端移动压缩消除内存碎片。移动对象STW 时间更长。新生代复制算法老年代标记清除 / 标记整理。3. STW Stop The WorldGC 执行时暂停所有用户线程。所有 GC 收集器都会 STW差别只是 STW 时间长短。低延迟收集器目标就是减少 STW 时长。四、主流垃圾收集器GC 收集器详解收集器就是 GC 算法的具体落地实现。不同收集器作用于新生代 / 老年代搭配使用。1. Serial 收集器串行收集器单线程收集GC 时唯一 GC 线程工作所有用户线程 STW。新生代复制算法老年代 Serial Old标记整理。适用客户端、单机小内存程序。缺点STW 时间长大内存场景卡顿明显。参数-XX:UseSerialGC2. Parallel 收集器并行收集器JDK8 默认多线程 GCSTW多条 GC 线程并行工作充分利用多核 CPU。Parallel Scavenge新生代复制 Parallel Old老年代标记整理目标吞吐量优先吞吐量 用户运行时间 / 总运行时间。牺牲停顿时间追求最大吞吐量。适合后台任务、批量计算对停顿不敏感的服务。参数-XX:UseParallelGC3. CMS 收集器Concurrent Mark Sweep并发标记清除JDK1.5 推出JDK9 开始废弃JDK14 移除老年代收集器并发标记 并发清除尽量和用户线程一起跑降低 STW。算法标记清除会产生内存碎片。目标低延迟减少停顿时间执行四阶段初始标记STW很短并发标记用户线程同时运行重新标记STW并发清除用户线程同时运行缺点内存碎片、CPU 占用高、浮动垃圾无法处理老年代快速增长。4. G1 收集器Garbage-FirstJDK9 默认面向服务端吞吐量与低延迟之间平衡JDK8 推荐JDK9 默认 核心思想化整为零将整个堆划分为多个大小相等的 Region 区域Eden、Survivor、老年代不再连续。可以同时管理新生代 老年代。优先回收垃圾最多的 RegionGarbage First。算法标记整理 复制不会产生大量内存碎片支持可预测停顿可设置预期最大停顿时间-XX:MaxGCPauseMillis阶段初始标记 (STW)、并发标记、最终标记 (STW)、筛选回收 (STW)参数-XX:UseG1GC5. ZGCZ Garbage CollectorJDK11 引入JDK17 稳定超低延迟收集器大内存首选几乎可以做到亚毫秒级 STW堆可以支持 TB 级别。着色指针 读屏障实现并发标记、并发整理。目标STW 时间几乎不随堆内存变大而增长。适用高并发、低延迟业务网关、订单核心服务。参数-XX:UseZGC6. Shenandoah 收集器RedHat 开发和 ZGC 类似低延迟并发整理JDK12 引入。国内使用少于 ZGC。五、GC 收集器对比汇总表表格收集器作用区域算法特点目标场景Serial新 老复制 / 标记整理单线程STW 长小应用客户端Parallel新 老复制 / 标记整理多线程吞吐量优先后台批量任务JDK8 默认CMS老年代标记清除并发低延迟内存碎片JDK8 老项目现已淘汰G1整个堆标记整理 复制分区模型可控停顿无碎片中小型服务JDK9 默认ZGC整个堆并发标记整理亚毫秒级 STW支持超大堆高并发核心业务低延迟六、JVM 启动常用参数# 堆初始大小最大堆 -Xms2g -Xmx2g # 指定GC收集器示例 -XX:UseG1GC -XX:UseZGC # 打印GC日志 -XX:PrintGCDetails七、面试高频考点堆和栈存放什么对象在哪栈存放局部变量、对象引用堆存放对象实例栈不存在 GC堆由 GC 回收。可达性分析是什么GC Roots 有哪些从 GC Roots 向下遍历引用链不可达对象判定垃圾列出 4 类 GC Roots。CMS、G1、ZGC 核心区别CMS老年代标记清除有碎片G1 分区化平衡吞吐量和延迟ZGC 超低 STW适合大堆低延迟场景。STW 是什么所有 GC 都会 STW 吗用户线程暂停全部收集器都有 STW只是停顿长短不同。新生代 GCMinor GC、老年代 GCFull GCMinor GC新生代满触发频率高速度快Full GC整堆回收STW 时间很长尽量避免。补充Major GC 指老年代 GC经常伴随 Full GC。八、总结虚拟机栈是线程私有存引用方法结束自动释放没有 GC堆是共享区域存放对象实例GC 回收堆内存。JVM 使用可达性分析判定垃圾三大基础 GC 算法复制、标记清除、标记整理。Parallel吞吐量优先CMS淘汰追求低延迟有碎片G1 分区平衡方案ZGC 亚毫秒级低延迟现代业务首选。线上调优核心目标尽量减少 Full GC降低 STW 停顿。
延伸阅读

更多相关文章

2026/10/14 4:45:50

LLM Agent可观测性实战:Tracing、Evals与成本追踪一体化落地

1. 这不是“又一个AI监控工具”,而是LLM应用落地的生存指南你有没有遇到过这样的情况:模型在测试环境里回答得头头是道,一上线就频繁“胡言乱语”;用户投诉说“昨天还能正常用,今天突然卡住半天没反应”;运…

2026/10/14 4:45:50

垂直行业AI Agent如何变现:外贸一体化智能工作台实战构想

通用AI Agent喊了这么久,真正靠它赚到钱的团队其实没多少。套壳聊天、通用写作、泛泛的助理——这些场景听着热闹,一谈付费就沉默,客户试完就溜,续费更是奢望。我自己看过不少团队在这上面耗了大半年,最后连服务器成本…

2026/10/14 4:45:50

分布式存储系统设计全解析:从架构选型到副本一致性

分布式存储系统设计,这六个字背后往往是硬盘爆满、数据迁移时凌晨两三点的折腾,以及“为什么我不能像用本地磁盘一样流畅地用一个集群”的灵魂拷问。我要写的,是某公司内部一套分布式存储系统的完整设计过程,从需求拆解、架构选型…

2026/10/14 5:46:16

电磁场与电磁波:从物理直觉到工程实操的三阶认知法

1. 项目概述:为什么“电磁场与电磁波”需要被重新讲清楚“你也能看得懂得电磁场与电磁波系列连载 2”——这个标题本身就是一个信号:它不是教材重印,不是公式堆砌,更不是课堂PPT的搬运工。它直指一个长期被忽视的现实问题&#xf…

2026/10/14 5:46:16

微电网下垂控制原理与工程实践解析

1. 微电网下垂控制基础概念微电网作为分布式能源系统的核心架构,其控制策略直接决定了系统稳定性和电能质量。下垂控制(Droop Control)作为微电网中最经典的一次调频方法,本质上模拟了传统电力系统中同步发电机的调频特性。我在参…

2026/10/14 5:46:16

新型电力系统中储能优化运行与预测区间控制策略

1. 项目背景与核心价值在新型电力系统建设背景下,配电网面临着日益突出的峰谷差问题。传统解决方案往往依赖扩容改造或需求侧管理,而基于预测区间的储能系统优化运行提供了一种更经济灵活的选择。这个方案的核心创新点在于将概率性预测与储能控制策略深度…

2026/10/14 5:46:16

水准测量与高程基准技术解析及应用实践

1. 水准测量技术解析水准测量作为传统大地测量的核心手段,其本质是通过建立高程控制网来实现地表点位的垂直定位。在实际作业中,我们通常采用几何水准测量方法,使用精密水准仪配合铟钢水准标尺,通过"后视-前视"的观测模…

2026/10/13 5:19:27

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/13 17:09:18

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/14 2:32:55

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/14 0:00:33

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:33

macOS/iOS高精度计时:mach_absolute_time原理与实战

1. 项目概述:为什么mach_absolute_time是 macOS/iOS 时间测量的“黄金标准”在 macOS 和 iOS 开发中,我见过太多人用CFAbsoluteTimeGetCurrent()或NSDate.timeIntervalSinceReferenceDate做性能打点,结果在高精度场景下被系统时钟跳变、NTP 同…

2026/10/14 0:00:33

SCORM课件演示与测试全解析:从API通信到自动化验证

简介:这是一套遵循SCORM标准的交互式课件演示与测试资源,面向E-Learning课程开发者、LMS平台测试人员及在线教学从业者,用于验证课件在不同学习管理系统中的识别、传递与跟踪能力。压缩包共28个文件,约12.07MB,以swf动…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑