JVM 深入理解 专栏导览
专栏定位
本专栏聚焦 Java 虚拟机(JVM) 的底层实现原理——从 .java 源码到最终在 CPU 上执行的机器码,中间经历了编译、类加载、字节码解释、即时编译等多个阶段,每个阶段都隐藏着精妙的设计。理解 JVM 不是为了”面试八股”,而是为了在性能调优、内存泄漏排查、GC 停顿分析等实际工程问题面前,能够从原理层面定位根因并给出解决方案。
本专栏以 HotSpot VM(OpenJDK 实现)为主要分析对象,覆盖 JDK 8 到 JDK 21 的关键演进,深入剖析运行时数据区、对象模型、垃圾回收器家族、类加载机制、字节码执行引擎和 JIT 编译优化。
目标读者
- 希望从”会用 Java”进阶到”理解 Java 为什么这样运行”的中高级工程师
- 需要进行 JVM 调优、GC 分析的后端/中间件开发者
- 准备深入学习 JVM 源码或参与虚拟机相关项目的技术爱好者
专栏目录
📌 全局概览(根目录)
| 序号 | 标题 | 核心内容 |
|---|---|---|
| 01 | 01 JVM 全局架构——从 .java 到机器码的完整旅程 | javac 编译、Class 文件结构、类加载子系统、运行时数据区、执行引擎、GC 子系统的全景图 |
📂 运行时数据区/
| 序号 | 标题 | 核心内容 |
|---|---|---|
| 02 | 02 运行时数据区——堆、栈、方法区的内存布局 | 程序计数器、虚拟机栈(栈帧结构)、本地方法栈、堆(新生代/老年代)、方法区/元空间的演进、直接内存与 NIO |
| 03 | 03 对象的创建、内存布局与访问定位 | 对象创建的五步流程、TLAB 分配、对象头(Mark Word + Klass Pointer)、实例数据与对齐填充、句柄 vs 直接指针、压缩指针(CompressedOops) |
📂 对象生命周期与GC/
| 序号 | 标题 | 核心内容 |
|---|---|---|
| 04 | 04 垃圾回收基础——可达性分析、安全点与安全区域 | 引用计数 vs 可达性分析、GC Roots 的枚举、四种引用类型(强/软/弱/虚)、OopMap 与安全点、安全区域的设计 |
| 05 | 05 垃圾回收算法——标记清除、复制、标记整理与分代假说 | 三种基础算法的原理与优缺点、分代收集假说、Minor GC / Major GC / Full GC 的触发条件、跨代引用与记忆集 |
| 06 | 06 经典垃圾回收器——Serial、Parallel、CMS 深度剖析 | Serial/Serial Old 的单线程模型、Parallel Scavenge/Old 的吞吐量优先策略、CMS 的四阶段并发标记与碎片问题 |
| 07 | 07 G1 收集器——Region 化内存与混合回收 | Region 划分(Eden/Survivor/Old/Humongous)、SATB 快照与并发标记、Mixed GC 的回收集选择、停顿预测模型、Full GC 的退化场景 |
| 08 | 08 ZGC——亚毫秒停顿的着色指针与读屏障 | 着色指针(Colored Pointer)的四种视图、读屏障(Load Barrier)、并发转移与重映射、分代 ZGC(JDK 21)、与 G1 的对比选型 |
| 09 | 09 Shenandoah——与 ZGC 殊途同归的并发压缩 | Brooks Pointer 转发指针、并发疏散(Concurrent Evacuation)、与 ZGC 的技术路线对比、适用场景分析 |
📂 类加载器/
| 序号 | 标题 | 核心内容 |
|---|---|---|
| 10 | 10 类加载机制——双亲委派模型与打破它的场景 | 加载→验证→准备→解析→初始化五阶段、双亲委派模型的源码实现、SPI/JNDI/OSGi/Tomcat 打破双亲委派的原因与方式、模块系统(JDK 9+) |
📂 执行引擎/
| 序号 | 标题 | 核心内容 |
|---|---|---|
| 11 | 11 字节码指令集与执行引擎 | Class 文件的魔数/版本/常量池/方法表结构、字节码指令分类(加载存储/运算/类型转换/控制转移/方法调用)、解释器 vs 编译器、方法调用的五条指令(invokevirtual/invokeinterface/invokespecial/invokestatic/invokedynamic) |
| 12 | 12 JIT 编译与逃逸分析——从解释执行到本地代码 | 分层编译(C1/C2)、热点探测(方法计数器/回边计数器)、逃逸分析(栈上分配/标量替换/锁消除)、内联缓存、OSR 编译 |
📂 JVM相关工具与性能调优/
| 序号 | 标题 | 核心内容 |
|---|---|---|
| 13 | 13 JVM 内存问题实战——OOM、内存泄漏与堆外内存 | 各区域 OOM 的触发条件与排查、常见内存泄漏模式(ThreadLocal/静态集合/未关闭资源)、堆外内存(DirectByteBuffer/Unsafe)的监控与泄漏排查 |
| 14 | 14 GC 调优实战——日志分析、参数调优与选型指南 | GC 日志格式解读(-Xlog:gc*)、关键指标(停顿时间/吞吐量/堆利用率)、各收集器的核心参数、JDK 8/11/17/21 的 GC 默认值演进、生产环境选型决策树 |
推荐阅读路径
入门路径:01 → 02 → 03 → 05 → 06 → 10
GC 深入路径:04 → 05 → 06 → 07 → 08 → 09 → 14
性能调优路径:12 → 13 → 14 → 02 → 07/08
前置知识
- Java 基础语法和常用 API
- 操作系统基础(进程/线程/虚拟内存)
- 建议先阅读 Java 并发编程 专栏了解 Java 线程模型
关联专栏
- Java 并发编程:对象头 Mark Word、锁升级、JIT 锁消除等与 JVM 内存布局密切相关
- Linux 内存管理:JVM 堆与 Linux 虚拟内存的关系,GC 与 Page Cache/Swap 的交互
- Linux 进程管理:Java 线程与 Linux 轻量级进程的映射
- Linux 性能优化:perf/async-profiler 配合 JVM 性能调优
- Go 语言核心:对比 JVM GC(G1/ZGC)与 Go GC(三色标记+混合写屏障)
- NameNode 长 GC 故障案例:JVM 内存与 Swap 的实战故障分析