本页是《Java 虚拟机原理与性能调优》的目录与学习路径。全书 31 篇:10 章 30 节,加这一篇目录。主线不是再写一个业务功能,而是把卷三留下的
libraryd当成观测对象:每一个结论都要能落到一条命令、一份日志或一个转储上。
这本书回答什么
前三卷把 library 从命令行程序长成了 libraryd 服务,又在卷三把类型、反射、类加载、并发和性能工具拆开讲了一遍。卷四换一个视角:同一段代码,JVM 在运行时到底做了什么。
具体是五个问题:
- 遇到延迟抖动、吞吐下降、内存增长,先看什么、怎么证明。
- 一个
.class文件如何变成内存里的类,一个对象如何排布在堆上。 - 解释器、C1、C2 如何接力,内联、逃逸分析、去虚拟化在什么条件下生效,什么时候又会反优化。
- 对象什么时候被回收,G1 与 ZGC 的停顿从哪里来,GC 日志每一列是什么意思。
- 堆、元空间、直接内存、线程栈、启动时间和容量,怎么测量、怎么设上限、怎么做回归。
全书概览
| 项目 | 内容 |
|---|---|
| 书稿 | 《Java 虚拟机原理与性能调优》 |
| 篇数 | 31 篇(10 章 30 节 + 目录篇) |
| 领域 | JVM 运行时、垃圾回收、JIT、诊断与性能工程 |
| 贯穿项目 | libraryd —— 不新增业务,只做观测、压测与调优 |
| 主线版本 | JDK 25 LTS(Temurin 25.0.5+8)、Maven 3.9.12 |
| 实验依赖 | JOL 0.17、Byte Buddy 1.18.16、JMH 1.37(按章使用) |
| 机器口径 | Apple M1 Pro,10 核,32 GB,macOS 26.3,默认 G1 |
| 上级专题 | 书稿专题 |
三条学习路径
全书按章顺序读是最完整的路径,但真实工作通常从一个症状开始。下面三条路径可以跳读。
路径一:线上症状 → 先定位
适合「服务变慢了 / 内存涨了 / 线程卡住了」的排障场景。
- 1.1 从现象到机制 :先建立「现象—假设—实验」的纪律。
- 1.3 观测工具全景 :知道每个工具回答什么问题。
- 6.1 GC 日志解析 :先把停顿和分配看清。
- 7.1 堆转储与支配树 / 7.2 内存泄漏定位 :内存问题往下钻。
- 8.1 线程栈与转储 :线程卡住时看栈。
- 10.2 一次完整的调优 :把证据变成参数。
路径二:GC 与内存 → 系统学
适合要选收集器、设堆上限、解释 GC 日志的读者。
- 3.1 运行时数据区 :先知道内存分几块。
- 3.2 对象布局 / 3.3 分配与 TLAB :对象怎么放、怎么分配。
- 5.1 可达性分析与引用类型 :谁会被回收。
- 5.2 分代假设与回收算法 / 5.3 收集器谱系 :算法与收集器。
- 6.1 GC 日志解析 → 6.2 G1 调优 → 6.3 ZGC 与低延迟取舍 。
- 7.3 元空间与直接内存 :堆外也要设上限。
路径三:启动与容量 → 工程收尾
适合做镜像、Serverless、弹性扩容和容量规划的读者。
- 2.1 类文件结构 / 2.2 类加载过程 :启动时到底加载了什么。
- 4.1 分层编译 :为什么冷启动慢、预热后快。
- 9.1 启动耗时分解 → 9.2 CDS 与 AppCDS → 9.3 AOT 缓存与 Native Image 。
- 10.1 压测设计与指标口径 → 10.3 建立回归基线与容量规划 。
十章一览
第一部分:方法与数据(第 1–2 章)
| 章 | 节 | 核心内容 |
|---|---|---|
| 1 方法论 | 1.1 从现象到机制 | 现象、假设、实验、证据;四条研究路径 |
| 1.2 建立可复现的实验环境 | CPU、堆、GC、启动参数固定;单变量对照 | |
| 1.3 观测工具全景 | jcmd、JFR、GC 日志、JMX 与 JMC 的分工 | |
| 2 类加载与字节码 | 2.1 类文件结构 | 常量池、方法表、属性、class 版本 69 |
| 2.2 类加载过程 | 加载、链接、初始化、双亲委派与类标识 | |
| 2.3 字节码执行模型 | 栈帧、局部变量表、操作数栈与调用指令 |
第二部分:内存与执行(第 3–4 章)
| 章 | 节 | 核心内容 |
|---|---|---|
| 3 运行时数据区 | 3.1 运行时数据区 | 堆、栈、元空间、代码缓存、直接内存 |
| 3.2 对象布局 | 对象头、压缩指针、字段重排与对齐 | |
| 3.3 分配与 TLAB | 指针碰撞、TLAB、PLAB、Humongous | |
| 4 执行引擎与 JIT | 4.1 分层编译 | 解释器、C1、C2、阈值与代码缓存 |
| 4.2 即时编译优化 | 内联、逃逸分析、标量替换、去虚拟化 | |
| 4.3 反优化与 OSR | uncommon trap、类层次变化、栈上替换 |
第三部分:垃圾回收(第 5–6 章)
| 章 | 节 | 核心内容 |
|---|---|---|
| 5 垃圾回收原理 | 5.1 可达性分析与引用类型 | GC Root、强/软/弱/虚引用、Cleaner |
| 5.2 分代假设与回收算法 | 复制、标记-清除、标记-整理、记忆集 | |
| 5.3 收集器谱系 | Serial、Parallel、G1、ZGC、Shenandoah | |
| 6 GC 调优与观测 | 6.1 GC 日志解析 | 统一日志、停顿字段、分配失败与日志轮转 |
| 6.2 G1 调优 | Region、Humongous、IHOP、Mixed GC | |
| 6.3 ZGC 与低延迟取舍 | 染色指针、读屏障、并发重定位与代价 |
第四部分:诊断与运行时(第 7–8 章)
| 章 | 节 | 核心内容 |
|---|---|---|
| 7 内存问题诊断 | 7.1 堆转储与支配树 | hprof、直方图、shallow/retained size |
| 7.2 内存泄漏定位 | 增长曲线、引用链、OOM dump | |
| 7.3 元空间与直接内存 | 类生成、类卸载、堆外泄漏与上限 | |
| 8 线程与锁运行时 | 8.1 线程栈与转储 | jstack、JSON 线程容器、死锁 |
| 8.2 锁的运行时实现 | Mark Word、Monitor、轻量级锁膨胀 | |
| 8.3 虚拟线程的运行时 | Continuation、载体线程、调度与 pinning |
第五部分:启动、压测与决策(第 9–10 章)
| 章 | 节 | 核心内容 |
|---|---|---|
| 9 启动加速 | 9.1 启动耗时分解 | 类加载、解释执行、JIT 与首请求 |
| 9.2 CDS 与 AppCDS | 基础归档、应用归档、失效条件 | |
| 9.3 AOT 缓存与 Native Image | AOTMode 三阶段、能缓存什么、边界 | |
| 10 综合调优实战 | 10.1 压测设计与指标口径 | 吞吐、分位、协调缺失、Little’s law |
| 10.2 一次完整的调优 | 现象→证据→假设→参数→回归 | |
| 10.3 建立回归基线与容量规划 | 基线 JSON、阈值、容量模型与边界 |
项目状态
卷四不新增业务功能,只在 libraryd 上增加观测与压测设施。
| 章 | libraryd 状态 |
|---|---|
| 1 | RuntimeProbe、scripts/jvm/collect.sh;建立观测基线 |
| 2 | Book / Loan 的 class 文件与字节码;插件类加载器复用 |
| 3 | LayoutLab;Book / Loan 的内存占用核算 |
| 4 | FinePolicy 热方法、JitLab;内联与去虚拟化实验 |
| 5 | LoanCache 的引用类型选择;收集器对照 |
| 6 | GC 日志采集、G1/ZGC 参数组、gc-summary.py |
| 7 | 泄漏 demo、HeapDumpOnOutOfMemoryError、元空间/直接内存上限 |
| 8 | 线程转储、锁竞争实验、DashboardService 虚拟线程 |
| 9 | 启动脚本、AppCDS/AOT 归档、首请求耗时 |
| 10 | libraryd-loadtest、压测报告、基线 JSON 与容量模型 |
实验口径
书里的「本机输出」统一来自下面这套环境;如果你的机器不同,绝对值会变,但方向和字段含义不变。
export JAVA_HOME=~/.jdks/jdk-25.0.5+8/Contents/Home
export PATH="$JAVA_HOME/bin:$PATH"
java -version
# openjdk version "25.0.5" 2026-10-20 LTS
# OpenJDK Runtime Environment Temurin-25.0.5+8 (build 25.0.5+8-LTS)
Apple M1 Pro,10 核,32 GB,macOS 26.3 (25D125)
默认 G1,压缩 oops,默认 MaxHeapSize 8 GB,G1 Region 4 MB
三条纪律:
- 一次只改一个变量。堆、GC、CPU 数、负载、warmup 任何一项变了,数字就不能直接比。
- 单次运行只说明「这次发生了什么」,不能当结论;至少重复三次并给分布。
- 没有命令和输出的数字不写;工具没装的,只讲用法,不编输出。
与站内其他内容的关系
- 《Java 编程入门》
:语言基础与
libraryCLI。 - 《Java 编程实战》
:工程化与
libraryd服务。 - 《Java 高级编程》
:语言机制、并发与性能工具;卷四直接承接它的
libraryd与 JMH/JFR 基线。 - 书稿专题 :全部书稿的入口。
怎么读
- 按顺序:从 1.1 开始,每节末尾有阅读导航。
- 按症状:用上面的三条路径,从对应章节进入。
- 按项目:把每节「在 libraryd 里落地」的类落到自己的服务里,先跑通命令,再改参数。
全书没有附录;需要的命令在正文里随用随查,卷三的附录 D 诊断命令清单 可以作为补充。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。