一、版本定位与发布策略先把四个版本的定位讲清楚发布节奏的变化 是理解 Java 生态的关键• JDK 8 之前大版本之间间隔 2-3 年功能堆积严重延期是常态JDK 9 跳票了三年• JDK 9 之后切换到 6 个月一个版本的 train model每年 3 月和 9 月发版• LTS 节奏最初是每 3 年一个 LTS8 → 11 → 17从 JDK 17 开始改为每 2 年17 → 21 → 25这个策略变化直接影响了我们的技术选型。很多团队在 JDK 8 上停留了近十年核心原因就是 JDK 9 到 JDK 16 期间没有 LTS 版本值得冒险升级。JDK 17 是第一个真正让大家觉得该升了的版本。关于许可证问题说两句JDK 8u211 之后Oracle JDK 商用需要付费。JDK 17 开始 Oracle 恢复了 NFTCNo-Fee Terms and Conditions许可可以免费商用。但很多公司已经转向了 AdoptiumEclipse Temurin、Amazon Corretto、Azul Zulu 等发行版这些发行版在各个版本上都是免费的。二、语言特性演进2.1 JDK 8Lambda 与 Stream 的函数式革命JDK 8 是 Java 历史上最重大的语言层面变革。它一次性引入了 Lambda、Stream、Optional、新日期 API 四个核心特性直接改变了 Java 的编程范式。Lambda 表达式和函数式接口JDK 8 之前写一个线程排序JDK 8 之后Lambda 的底层实现值得了解它不是匿名内部类的语法糖。编译器用 invokedynamic 指令在运行时通过 LambdaMetafactory 生成实现类避免了匿名内部类在编译期生成大量 .class 文件的问题。你可以用 javap -c -p 看到这个区别Stream APIStream 的核心设计是惰性求值lazy evaluation。中间操作filter、map、flatMap不会立即执行只有终端操作collect、forEach、reduce触发时才会一次性处理整个管道关于 parallel stream我的建议是在 Web 应用中极少使用它。parallel stream 底层使用 ForkJoinPool.commonPool()这个线程池是全局共享的。如果你在一个 HTTP 请求处理中使用 parallel stream 处理一个耗时操作会影响其他请求中 parallel stream 的执行。我们曾因此在生产环境遇到过接口超时。上图展示了 Stream 管道的完整处理流程——从数据源到中间操作惰性再到终端操作触发执行以及 parallel stream 的 Fork-Join 分治模型。Optionaljava.time API终于替掉了灾难般的 java.util.Date 和 Calendar2.2 JDK 9-16 的关键过渡特性这一段很多人会直接跳过但实际上 JDK 9-16 的过渡特性在后续 LTS 版本中全部转正了。不了解它们的演化过程你用 JDK 17/21 的时候会觉得这些特性凭空冒出来。JDK 9模块系统Project JigsawJDK 9 还引入了集合工厂方法、JShell、接口私有方法JDK 10局部变量类型推断varJDK 11String 增强、HttpClient 标准化JDK 14Records预览、instanceof 模式匹配预览JDK 15Text Blocks2.3 JDK 17语言特性的成熟期JDK 17 把 JDK 14-16 期间预览的特性全部转正形成了一个完整的现代 Java特性集。Sealed ClassesJEP 409Sealed classes 限定了一个类的子类范围配合 pattern matching 使用时编译器可以做穷举检查图展示了 Sealed Classes 的继承约束——sealed 接口只允许指定的子类实现final 子类不能再被继承non-sealed 子类则开放扩展。Pattern Matching for instanceofJEP 394JDK 17 其他值得关注的变化• 移除了 AOT 编译器和 JIT 编译器的 Graal 接口JEP 410——这意味着如果要用 GraalVM需要单独安装• 强封装 JDK 内部 APIJEP 403——--illegal-accesspermit 不再生效• 移除了 RMI ActivationJEP 407• 恢复始终严格的浮点语义JEP 3062.4 JDK 18-20 的过渡这三个非 LTS 版本为 JDK 21 的两个杀手级特性做了铺垫• JDK 18默认字符编码改为 UTF-8JEP 400Simple Web ServerJEP 408• JDK 19Virtual Threads 首次预览JEP 425Structured Concurrency 孵化JEP 428• JDK 20Scoped Values 孵化JEP 429Record Patterns 二次预览JEP 4322.5 JDK 21并发模型的革命JDK 21 是继 JDK 8 之后 Java 平台最重大的一次变革。Virtual Threads 的正式发布从根本上改变了 Java 的并发编程模型。Virtual ThreadsJEP 444Virtual Thread 不是轻量级线程这么简单的描述能概括的。它的本质是将线程从操作系统资源变成了 JVM 管理的资源。传统 Platform Thread 的问题• 每个线程占用约 1MB 栈内存可配置默认 -Xss1m• 线程创建和销毁涉及系统调用pthread_create/pthread_exit• 上下文切换成本高内核态切换• 一个 JVM 进程能创建的线程数通常在几千到几万Virtual Thread 的实现机制• 由 JVM 管理不直接映射到 OS 线程• 使用 Continuation 保存和恢复执行状态• 在遇到阻塞操作时I/O、sleep、锁等自动从 carrier thread载体线程上卸载unmount• 阻塞解除后调度到任意可用的 carrier thread 上继续执行• 栈空间按需增长初始只有几百字节