Skip to content

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)

理解核心原理,比记住版本差异更重要。

下一步

基于 VitePress 构建