第 2 章配套代码索引
这一章的代码分两类:验证机制的实验(让你亲眼看到 JIT/GC/协程的行为)和可直接抄用的配置(JMH 骨架)。 它们运行在你的开发机上,数字只用于量级对比,不能用于工程决策。
一、文件清单
| 文件 | 对应小节 | 内容 |
|---|---|---|
| 01-execution-tiers.md | 2.1 四种执行形态 | 台阶式提升演示 + PrintCompilation 解读 |
| 02-jit-optimizations-and-deopt.md | 2.2 JIT 优化与去优化 | 单态/双态/巨态调用点对比,诱发去优化 |
| 03-microbenchmark-traps.md | 2.3 微基准四大陷阱 | 四个陷阱各写一个坏版本 |
| 04-warmup-steady-coldstart.md | 2.4 预热、稳态与冷启动 | 用滚动 CV 自动判定稳态 + 冷启动测量 |
| 05-memory-and-gc.md | 2.5 内存与 GC | 分配速率测量、GC 日志解读、Humongous 演示 |
| 06-concurrency-primitives.md | 2.6 并发原语成本 | 原语成本表 + 伪共享对照实验 |
| 07-coroutines-cost-model.md | 2.7 协程开销模型 | 协程成本 + 调度器饥饿实验(最重要) |
| 08-jmh-and-kotlinx-benchmark.md | 2.8 JMH 与 kotlinx-benchmark | 完整可运行的基准工程配置 |
| 09-lab2.md | 2.9 Lab 2 | Lab 2 的实验代码骨架 |
二、运行准备
这些实验大多是单文件 main 程序,放在 src/main/kotlin/lesson02/ 下即可运行:
./gradlew build
java -cp build/classes/kotlin/main lesson02.ExecutionTiersKt
运行 JVM 相关的实验时,建议统一加上这些参数(第 2 章的很多现象需要它们才看得到):
java -XX:+PrintCompilation \
-Xlog:gc*:file=gc.log:time,uptime,level,tags \
-cp build/classes/kotlin/main lesson02.ExecutionTiersKt
各实验需要的 -XX 参数,会在对应文件里单独说明。
三、三条纪律
- 每个实验跑 3 次。单次结果在开发机上没有意义。
- 先猜再看。读代码前猜一下输出,猜错的地方才是你真正学到东西的地方。
- 改参数再跑一遍。参数的敏感性比默认输出更有教学价值。
四、容易踩的环境坑
| 坑 | 表现 | 解决 |
|---|---|---|
| 后台进程干扰 | 数字波动 30%+ | 关掉浏览器、IDE 索引、备份任务 |
| CPU 降频 | 后跑的基准比先跑的慢 | 插电、设置 performance governor |
| 没有 fork 隔离 | 第二个基准受第一个的 profile 影响 | 每个实验独立进程运行 |
| 编译器和 JMH 抢 CPU | 结果抖动大 | JMH 会自己处理;裸计时实验无法避免 |
macOS 上部分 /proc 参数缺失 |
脚本报 n/a |
正常现象,换 Linux 环境做严格测量 |