按两个方向组织。语言特性回答「这个 API 该怎么用、为什么这样设计」,运行时回答「线上出问题怎么定位」。每篇的结论都标了 JDK 版本与 JEP 编号,代码在 JDK 21.0.8 与 JDK 25 上编译运行过。
语言特性
| 文章 | 回答的问题 |
|---|---|
| Java——Optional类的使用 | Optional 怎么用,orElse 与 orElseGet 的差别在哪 |
| Java——Stream API 常见误用 | 12 类能静默出错的写法,以及 Collectors 的边界 |
| Java——Stream Gatherers 自定义管道 | 内建五个 Gatherer 各自解决什么,自定义的惰性与短路怎么保证 |
| Java——CompletableFuture 异步编程实战 | thenApply / thenCompose / allOf 的语义边界与异常传播 |
| Java——record、sealed 与模式匹配 | 三者怎么组合成代数数据类型,穷尽性检查怎么用 |
| Java——模式匹配演进史:从 JEP 406 到 JEP 441 | 一个语法特性为什么改了五轮预览 |
| Java——ScopedValue 替代 ThreadLocal | 上下文传递为什么不该挂在池化线程上,绑定能被谁继承 |
运行时与版本
| 文章 | 回答的问题 |
|---|---|
| Java——虚拟线程实战 | 什么时候有用、什么时候是负优化,pinning 在哪个版本变了 |
| Java——虚拟线程迁移实测 | 同样一段服务换成虚拟线程,吞吐与延迟变了多少 |
| Java——一次锁竞争的完整定位 | 接口变慢,怎么用线程 dump 与 JFR 定位到锁 |
| Java——JVM 内存与 GC 定位实战 | GC 日志、jcmd、堆 dump 三层证据怎么串起来 |
| Java——JDK 21 到 25 迁移清单 | 从上一个 LTS 升上来会撞到什么,逐项带实测证据 |
| Java——结构化并发实战(StructuredTaskScope) | 一个请求并发调多个下游,怎么保证不泄漏、超时与取消怎么传 |
| Java——容器里的 JVM:内存、CPU 与镜像 | 容器限额下 JVM 怎么读核数与内存,镜像怎么在体积和可运行性之间取舍 |
| Java——并发工具选型:从线程池到结构化并发 | 该用线程池、虚拟线程还是结构化并发 |
| Java——JFR 实战:录制、事件与开销实测 | 录制从哪发起、录完拿什么读、开销有多大 |
阅读建议
模式相关的二十六篇已归到 设计模式系列。想先动手的从「虚拟线程实战」开始,那篇给了判断标准;要排障的看「锁竞争」与「内存与 GC」两篇,它们共用同一套方法(先减少不确定性,再逐层取证)。升级 JDK 或把服务搬上容器之前,先读「JDK 21 到 25 迁移清单」与「容器里的 JVM」;并发改造则从「虚拟线程实战」顺着读到「结构化并发」和「ScopedValue」。




