盘点 JDK11 新特性:从语法、API 到 GC,一篇吃透企业级 LTS 版本
目录
1. JFR 开源(Java Flight Recorder)
大家好,我是你们的 Java 后端开发者。JDK 11 是继 JDK 8 之后业界公认最稳定、使用最广泛的长期支持(LTS)版本,也是目前互联网公司、传统企业、微服务架构升级的首选目标版本。不管是面试、项目重构还是技术选型,JDK 11 都是 Java 工程师必须掌握的核心版本。

本文从语言特性、API 增强、标准库更新、GC、安全、模块化、性能工具等维度全面盘点,内容详实、可直接用于学习、面试总结和项目实践。
一、JDK 11 整体概况
- 发布时间:2018-09-25
- 版本类型:LTS(长期支持版)
- 后续商用支持周期长,是目前生产环境主流版本
- 相比 JDK 8:模块化成熟、语法更简洁、GC 更强、内置 HTTP Client、安全性大升级
- 相比 JDK 9/10:稳定、无过渡版本问题,适合直接落地
一句话总结:JDK 8 是过去,JDK 11 是现在,JDK 17 是未来,而 JDK 11 是最稳妥的升级跳板。
二、语言层面新特性
1. Lambda 表达式支持 var(JEP 323)
JDK 10 带来了局部变量类型推断 var,JDK 11 进一步将其扩展到 Lambda 表达式的参数上。
// JDK 11 写法
var list = List.of("Java", "JDK11", "CSDN");
list.stream()
.map((var s) -> s.toUpperCase())
.forEach(System.out::println);
优势:
- 统一变量声明风格
- Lambda 参数可以加注解:
(@Nullable var x, @NonNull var y) -> x + y
- 代码更整洁,便于阅读和维护
三、标准库 API 重磅增强(开发效率提升)
1. String 类新增实用方法(高频必用)
JDK 11 对 String 做了非常多增强,几乎每个项目都能用得上。
// 1. 判断是否为空白字符(包括全角空格、制表符、换行)
" ".isBlank();
// 2. 去除前后空白(比 trim() 更强大,支持全角空格)
" Java 11 ".strip();
// 3. 去除左边空白
" Java".stripLeading();
// 4. 去除右边空白
"Java ".stripTrailing();
// 5. 字符串重复
"=".repeat(10); // ==========
// 6. 按行分割返回 Stream
"a\nb\nc".lines().forEach(System.out::println);
意义: 大量简化字符串处理,告别第三方工具类(如 Apache Commons Lang)。
2. Files 工具类增强:一行读写文件
以前读写文件需要 IO 流、try-catch,现在极简:
Path path = Paths.get("test.txt");
// 写入字符串
Files.writeString(path, "Hello JDK11", StandardCharsets.UTF_8);
// 读取字符串
String content = Files.readString(path, StandardCharsets.UTF_8);
非常适合配置读取、文本处理、脚本类场景。
3. Collection 转数组更优雅
List<String> list = List.of("A", "B", "C");
// JDK 11
String[] array = list.toArray(String[]::new);
代码更简洁,语义更清晰。
4. Optional 加强
// 空值时执行一个 Runnable
Optional.<String>empty().ifPresentOrElse(
System.out::println,
() -> System.out.println("值不存在")
);
对空值的处理更加优雅,减少 if-else。
四、标准化 HTTP Client(JEP 321)
JDK 11 正式把 Java 9 引入的HttpClient 标准化,内置支持 HTTP/2、WebSocket、异步、连接池。
再也不用手动引入 OkHttp 或 HttpClient 框架!
示例:同步请求
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://www.baidu.com"))
.GET()
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
示例:异步请求
client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
.thenApply(HttpResponse::body)
.thenAccept(System.out::println)
.join();
优势:
- 原生支持 HTTP/2,多路复用,性能更高
- 支持异步非阻塞,适合高并发
- 支持 WebSocket
- 无需第三方依赖,减少包冲突
五、直接运行单 Java 文件(JEP 333)
JDK 11 允许直接运行 .java 文件,无需手动 javac 编译。
java Hello.java
适用场景:
- 写小工具、测试代码
- 脚本化、自动化任务
- 教学、快速验证逻辑
极大提升开发调试效率。
六、垃圾回收器升级(重点面试点)
1. ZGC 实验性引入(JEP 333)
JDK 11 最重磅的 GC 之一:ZGC
- 目标:停顿时间 < 10ms
- 支持 TB 级大堆
- 吞吐量影响极小
- 云原生、大内存服务、低延迟服务的福音
启用方式:
-XX:+UnlockExperimentalVMOptions -XX:+UseZGC
注:JDK 11 中为实验版,JDK 17 后正式可用。
2. Epsilon GC(No-Op GC)
只分配内存,不做垃圾回收。
用途:
- 性能基准测试
- 短生命周期任务
- 验证内存分配速率
-XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC
3. G1 成为默认 GC
JDK 11 默认 GC 就是 G1,综合吞吐量与延迟表现均衡,适合绝大多数服务。
七、安全与加密增强
- TLS 1.3 内置支持,更快、更安全、握手延迟更低
- 支持新一代椭圆曲线算法:Curve25519/Curve448
- 支持 ChaCha20/Poly1309 对称加密算法
- 废弃老旧不安全的加密协议
对金融、支付、微服务安全通信非常友好。
八、模块化与移除内容(升级必看)
JDK 11 彻底移除了 Java EE 和 CORBA 相关模块,包括:
- JAXB
- JAX-WS
- JAF
- CORBA
这些模块在 JDK 8 中存在,JDK 9/10 被标记为废弃,JDK 11 直接删除。
升级时如果报错类找不到,需要手动引入依赖:
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.3</version>
</dependency>
九、性能与诊断工具升级
1. JFR 开源(Java Flight Recorder)
以前商业版功能,JDK 11 开始开源免费。
- 极低开销性能监控
- 方法执行、内存分配、线程、IO、GC 全视角
- 适合生产环境问题定位、性能调优
2. 更好的 Heap Profiling
低开销、实时堆内存分析,定位内存泄漏更方便。
3. 支持 Unicode 10
更全的字符、表情符号、特殊符号支持。
十、JDK 8 升级到 JDK 11 常见问题
- 部分 API 被删除(如 JAXB)
- 内部 API 无法直接访问(sun.misc 包)
- 第三方依赖不兼容(老框架、老工具)
- 启动参数、GC 参数调整
- Lombok、IDEA、Maven/Gradle 需升级适配版本
- 模块化导致的访问权限问题
总体来说:只要框架不是特别老旧,升级成本可控,收益巨大。
十一、总结:为什么要用 JDK 11?
- LTS 稳定版,企业生产环境首选
- 语法更简洁:
var、String 增强 - 原生强大:HTTP Client、文件读写、Stream 增强
- 低延迟 GC(ZGC) 为高并发大内存服务铺路
- 安全、性能、工具链全面现代化
- 是从 JDK 8 迈向更高版本(JDK 17+)的必经之路
如果你还在 JDK 8,建议尽快规划升级;如果你即将开始新项目,直接 JDK 11 起步。
更多推荐



所有评论(0)