JVM 原理
深夜,你写的这段代码突然 Full GC 了 30 秒。
用户打来电话,运维发来告警。你盯着监控面板上那条陡然上升的曲线,不知道哪里出了问题。
你回到代码检查业务逻辑——没问题。查数据库连接池——正常。看线程状态——没有死锁。
最后,你看了一眼堆内存走势,发现对象堆积的曲线从上线那天起就没下来过。
问题不在业务代码,而在内存分配的速度,远快于 GC 回收的速度——而你根本不知道自己写的代码,在 JVM 里长什么样。
理解 JVM,就是理解你代码的「另一半生命」。
JVM 是什么
JVM(Java Virtual Machine) 是 Java 虚拟机的简称。它不是一个硬件,而是一个运行在操作系统之上的软件层,负责把 .class 字节码文件翻译成机器能执行的指令。
Java 喊出「一次编写,到处运行」的口号,靠的就是 JVM:
- Linux 上有 HotSpot,Windows 上也有 HotSpot
- 你写一份
.class,不用改一行代码,丢到哪个平台都能跑 - 底层差异由 JVM 抹平了
但「能跑」只是第一步。跑得好不好、快不快、稳不稳——这些才是 JVM 知识真正的价值。
学 JVM 能解决什么问题
很多人学 JVM 是因为面试要问。但实际上,JVM 知识在日常开发中无处不在。
场景一:线上 OOM
java.lang.OutOfMemoryError: Java heap space这句报错你见过吗?没见过说明你运气好。见过的都知道,OOM 不只是「内存不够」,背后往往是:哪里在持续创建对象但没释放。
懂 JVM 的人会用 MAT、jmap、Arthas 快速定位泄漏点。不懂的只能重启服务器,然后祈祷。
场景二:GC 停顿导致接口超时
GC 是必要的,但 STW(Stop The World)不是。MinorGC 每分钟几次还好,但如果老年代持续增长、触发 FullGC,停顿时间可能从几毫秒飙到几秒。
你的接口 RT(Response Time)突然从 20ms 变成 2000ms,根因往往在 GC 参数配置或代码里的对象泄漏。
场景三:死循环与线程阻塞
CPU 100%、线程池打满、接口全部超时——这种情况 jstack 一拉,能看出是死锁、热锁,还是代码里有无限循环。
不懂 JVM 的人只会说「服务挂了」。懂 JVM 的人能说出是哪个线程、哪行代码、哪个锁出了问题。
内容地图
根据 sidebar,这份文档分为六个部分:
第一部分:JVM 基础认知
Java 上层技术与 JVM 的关系 · JVM 的位置与整体结构 · Java 代码执行流程 · 主流 JVM 虚拟机介绍
这是入门的第一级台阶。看完这部分,你应该能说清楚:代码从写好到跑起来,经历了哪些步骤,JVM 在其中扮演什么角色。
第二部分:JVM 运行时数据区(核心)
内存结构整体概述 · 类加载器与类加载过程 · 虚拟机栈 · 堆空间 · 方法区(永久代/元空间)
这部分是整个 JVM 模块的核心。堆、栈、方法区——这三个概念贯穿了 Java 程序员的整个职业生涯。不理解它们,就不理解对象从创建到销毁的完整生命周期。
第三部分:执行引擎与核心专题
执行引擎作用与工作过程 · String 专题(JVM 视角)
解释器是怎么逐行翻译字节码的?JIT 编译器什么时候介入?为什么字符串拼接有时快有时慢?这部分解答的是「代码是怎么被 CPU 执行」的细节问题。
第四部分:垃圾回收(GC)核心
GC 概念与必要性 · 垃圾回收算法 · 7 种垃圾回收器总结 · GC 日志分析
GC 是 JVM 里水最深的部分。标记-清除、复制、标记-压缩——三种算法各有优劣。Serial、ParNew、Parallel、CMS、G1、ZGC、Shenandoah——每种回收器都有自己的适用场景。理解它们的原理,才能在调优时做出正确的选择。
第五部分:字节码与类加载深度剖析
Class 文件结构 · 字节码指令集 · 类加载深度剖析
字节码是 Java 编译后的产物。不懂字节码,永远只能看 Java 语法层面怎么写代码。有了字节码知识,你能看懂 javap 输出的内容,能理解 invokedynamic 怎么支持了 Lambda 表达式,能读懂方法签名的底层含义。
第六部分:性能监控与调优(实战)
调优三部曲/性能测试指标 · 命令行工具 jps/jstat/jstack · Arthas 实战案例 · OOM 及性能优化案例
前面的内容是「原理」,这部分是「实战」。学了半天 GC 算法,最后还是要解决问题:服务器 OOM 怎么排查?GC 停顿时间太长怎么调? Arthas 怎么用?这些问题的答案都在这里。
学习顺序建议
JVM 的知识是有依赖关系的。建议按这个顺序来:
第一步:JVM 基础认知
↓ (理解 JVM 是什么、代码怎么跑起来的)
第二步:运行时数据区(重点)
↓ (堆/栈/方法区,是后面所有内容的基石)
第三步:垃圾回收
↓ (理解了内存划分,再看 GC 就顺理成章)
第四步:执行引擎 + String 专题
↓ (偏底层,了解即可)
第五步:字节码与类加载
(进阶内容,可以单独深入)
第六步:性能监控与调优
(实战篇,边学边用)如果你时间紧张,优先把 第二部分(运行时数据区) 和 第四部分(GC) 吃透——这两个部分应付面试和日常工作足够用了。
版本说明
本模块以 JDK 17 LTS 为主线,涵盖 HotSpot 虚拟机的实现细节。
JVM 的核心设计从 JDK 8 到 JDK 17 没有本质变化,新增内容主要是:
- G1 成为默认回收器(JDK 9)
- ZGC 和 Shenandoah 正式引入(JDK 11/JDK 12)
- 元空间替代永久代(JDK 8)
理解核心原理,比记住版本差异更重要。
下一步
- 想先知道 JVM 在整个 Java 技术栈中的位置 → Java 上层技术与 JVM 的关系
- 想直接看最核心的内存结构 → JVM 的位置与整体结构
- 想从宏观视角看完整模块内容 → JVM 内存与垃圾回收篇概述
