JDK11你必须了解的新特性
Epsilon: A No-Op Garbage Collector(Epsilon — 无操作的垃圾回收器)
Epsilon只会处理内存分配但不实现任何实际内存回收机制的GC,一旦堆内存用完,JVM就会退出。
它的使用场景:
-
性能测试。由于它没有GC,所以可以在压测时过屏蔽GC对程序性能的影响。也可以用它来对不同的实际会进行GC的回收器进行性能差异分析。 内存压力测试。比如测试用例应该分配不超过1 GB的内存,可以使用-Xmx1g配置-XX:+UseEpsilonGC,如果违反了该约束,则会heap dump并崩溃。 非常短的JOB任务。这个特性在Serverless,AWS Lambda,这种场景会很有效。 要求极低延迟的任务。由于GC操作带来的暂停,对于这样的应用来说是不能接受的。通过Epsilon可以避免GC操作带来的暂停。这相当于用内存换取执行时间。
HTTP Client
新的HTTP Client在JDK9中孵化,经过两个版本的优化后,在JDK11中正式转正。
Local-Variable Syntax for Lambda Parameters
允许在声明隐式类型lambda表达式的形参时使用var。
隐式类型lambda表达式:
(x, y) -> x.process(y)
JDK 10让隐式类型变量可用于本地变量:
var x = new Foo();
for (var x : xs) { ... }
try (var x = ...) { ... } catch ...
为了和本地变量保持一致,允许var作为隐式类型lambda表达式的形参:
(var x, var y) -> x.process(y)
一致性的一个好处是,修饰符,尤其是注释,可以应用于局部变量和lambda形式,而不会失去简洁。
@Nonnull var x = new Foo(); (@Nonnull var x, @Nullable var y) -> x.process(y)
Flight Recorder(飞行记录器)
它是一个低开销的数据收集框架,可用于在生产环境中分析Java应用和JVM运行状况及性能问题。
故障诊断、监控和profile收集分析是开发周期中不可缺少的一部分。但是很多问题都只会在高负载的生产环境中产生。此时就需要一个可以在生产环境中使用的监控工具,JFR由此而生。
JFR会从应用程序中记录运行时事件,同时也会记录JVM和OS的。记录的结果会存在一个单独的文件中,此文件可供开发工程师分析bug和性能问题。同时JDK中也提供了可视化工具来分析这类文件。
JFR在JDK中相关的模块:jdk.jfr,jdk.management.jfr
JFR有如下两种启动方式
-
增加JVM参数:-XX:StartFlightRecording 通过jcmd工具使用,用例如下:
- jcmd JFR.start :开始记录。 jcmd JFR.dump filename=recording.jfr 。将记录文件dump下来,通过jmc来分析。
- jcmd JFR.stop :停止。
最初的Java飞行记录器(JFR)和Java任务控制(JMC)工具是Oracle在2008年收购BEA系统时获得的,之前这个功能都是商业化的,在JDK11中开源了出来。
ZGC: A Scalable Low-Latency Garbage Collector (Experimental)(ZGC:可伸缩低延迟垃圾回收器)
现代系统中可用内存不断增长, 用户和程序员希望JVM能够以高效的方式充分利用这些内存,并且无需长时间的GC暂停时间。 ZGC一个并发,基于region,压缩型的垃圾回收器,只有root扫描阶段会STW,因此GC停顿时间不会随着堆的增长和存活对象的增长而变长。
ZGC特性:
-
GC暂停时间不会超过10ms; 即能处理几百兆小堆,也能处理几个T的大堆(OMG); 和G1相比,应用吞吐能力不会下降超过15%; 为未来的GC功能和利用colord指针以及Load barriers优化奠定基础; 初始只支持64位系统;
ZGC在JDK11还处于实验阶段,所以需要通过JVM参数UnlockExperimentalVMOptions 来解锁这个特性。
-XX:+UnlockExperimentalVMOptions -XX:+UseZGC
使用ZGC除了带来了高效的垃圾回收功能外,也避免了垃圾回收器一堆的配置参数需要配置和调优。
完整特性
181: 309: 315: 318: 320: 321: 323: 324: 327: 328: 329: 330: 331: 332: 333: 335: 336:
