Java 11 在 2018 年 9 月 25 日发布。这是 Java 8 之后首个长期版本。
安装
因为我本地使用 asdf 来管理 Java 的多个版本,所以直接使用 asdf 来安装:
asdf install java adoptopenjdk-11.0.17+8
asdf global java adoptopenjdk-11.0.17+8
java -version
HTTP Client 升级
Http Client 几乎被重写,支持异步非阻塞。
包名从 jdk.incubator.http
改为 java.net.http
,通过 CompleteableFutures
提供非阻塞请求。新的 HTTP Client 提供了对 HTTP/2 的支持,兼容 HTTP/1.1 ,与主流的开源库(Apache HttpClient,Jetty, OkHttp)性能相差无几。
Java 在 Reactive-Stream 的实践,广泛使用了 Java Flow API。
模拟 GET 请求:
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("http://openjdk.java.net/"))
.build();
client.sendAsync(request, BodyHandlers.ofString())
.thenApply(HttpResponse::body)
.thenAccept(System.out::println)
.join();
Epsilon 低开销垃圾回收器
Epsilon 目标是开发一个内存控制器,不执行任何垃圾回收,提供完全消极的 GC 实现,最大限度降低内存占用和内存吞吐延迟时间。
通过 JVM 参数 -XX:+UseEpsilonGC
来开启。
为什么要开发一个不回收内存的垃圾回收器
一些特殊的场景可以不开启垃圾回收以方便进行比如性能测试,内存压力测试等等。
简化单个源代码文件的启动方法
Java 11 可以直接运行一个单一的源码文件,Java 解释器可以直接在内存中编译,然后执行。所有的类都必须定义在同一个 Java 文件中。
这个功能特别适合想要简单了解一下 Java,写一些脚本文件的时候非常有用。
本地变量类型推断
Lambda 参数的局部变量语法
Java 10 开始就引入了 var 关键字,允许局部变量推断。
但在 Java 10 中有几个限制:
- 只能用于局部变量
- 声明时必须初始化
- 不能用于方法参数
- 不能在 Lambda 表达式中
Java 11 中允许开发者直接在 Lambda 表达式中使用 var 进行参数声明。
低开销的 Heap Profiling
Java 11 中提供了一种低开销的 Java 堆分配采样方法,能够得到堆分配的 Java 对象信息,并能够通过 JVMTI 访问堆信息。
- 低开销,可以默认开启
- 定义好的程序接口访问
- 堆所有堆分配区域进行采样
- 给出正在和未被使用的 Java 对象信息
ZGC 可伸缩低延迟垃圾收集器
ZGC 是 Z Garbage Collector ,GC 停顿时间短,不超过 10ms,能处理 T 级别堆大小。
实验阶段,只在 Linux/x64 上可用,在编译时加入参数才可以启用,并且使用时需要增加 JVM 参数。
飞行记录器
低开销的事件信息收集框架。
启用参数:
-XX:StartFlightRecording