JDK11新功能详解

JDK11于2018-09-25正式发布。一共有 17 个新特性。

JDK11发布计划

2018/06/28        Rampdown Phase One (fork from main line)
2018/07/19        All Tests Run
2018/07/26        Rampdown Phase Two
2018/08/16        Initial Release Candidate
2018/08/30        Final Release Candidate
2018/09/25        General Availability

说明:GA即General Availability,也就是官方推荐可以广泛使用的版本。

JDK11特性一览

181: Nest-Based Access Control
309: Dynamic Class-File Constants
315: Improve Aarch64 Intrinsics
318: Epsilon: A No-Op Garbage Collector
320: Remove the Java EE and CORBA Modules
321: HTTP Client (Standard)
323: Local-Variable Syntax for Lambda Parameters
324: Key Agreement with Curve25519 and Curve448
327: Unicode 10
328: Flight Recorder
329: ChaCha20 and Poly1305 Cryptographic Algorithms
330: Launch Single-File Source-Code Programs
331: Low-Overhead Heap Profiling
332: Transport Layer Security (TLS) 1.3
333: ZGC: A Scalable Low-Latency Garbage Collector
   (Experimental)
335: Deprecate the Nashorn JavaScript Engine
336: Deprecate the Pack200 Tools and API

特性详解

JEP 318: Epsilon: A No-Op Garbage Collector

DK上对这个特性的描述是:开发一个处理内存分配但不实现任何实际内存回收机制的GC,一旦可用堆内存用完,JVM就会退出。

如果有System.gc()的调用,实际上什么也不会发生(这种场景下和-XX:+DisableExplicitGC效果一样),因为没有内存回收,这个实现可能会警告用户尝试强制GC是徒劳。

用法非常简单:-XX:+UseEpsilonGC。

动机
提供完全被动的GC实现,具有有限的分配限制和尽可能低的延迟开销,但代价是内存占用和内存吞吐量。

众所周知,Java实现可广泛选择高度可配置的GC实现。 各种可用的收集器最终满足不同的需求,即使它们的可配置性使它们的功能相交。 有时更容易维护单独的实现,而不是在现有GC实现上堆积另一个配置选项。

用途

  • 性能测试(它可以帮助过滤掉GC引起的性能假象);
  • 内存压力测试(例如,知道测试用例应该分配不超过1 GB的内存,我们可以使用-Xmx1g配置-XX:+UseEpsilonGC,如果违反了该约束,则会heap dump并崩溃);
  • 非常短的JOB任务(对于这种任务,接受GC清理堆那都是浪费空间);
  • VM接口测试;
  • Last-drop 延迟&吞吐改进;

JEP 320: Remove the Java EE and CORBA Modules

Java EE和CORBA两个模块在JDK9中已经标记”deprecated”,在JDK11中正式移除。JDK中deprecated的意思是在不建议使用,在未来的release版本会被删除。
动机
JavaEE由4部分组成:

JAX-WS (Java API for XML-Based Web Services),
JAXB (Java Architecture for XML Binding)
JAF (the JavaBeans Activation Framework)
Common Annotations.
但是这个特性和JavaSE关系不大。并且JavaEE被维护在Github(https://github.com/javaee)中,版本同步造成维护困难。最后,JavaEE可以单独引用,maven中心仓库也提供了JavaEE(http://mvnrepository.com/artifact/javax/javaee-api/8.0),所以没必要把JavaEE包含到JavaSE中。

至于CORBA,使用Java中的CORBA开发程序没有太大的兴趣。因此,在JavaEE就把CORBA标记为”Proposed Optional”,这就表明将来可能会放弃对这些技术的必要支持。

JEP 321: HTTP Client (Standard)

将JDK9引进并孵化的HTTP客户端API作为标准,即HTTP/2 Client。它定义了一个全新的实现了HTTP/2和WebSocket的HTTP客户端API,并且可以取代HttpURLConnection。

动机
已经存在的HttpURLConnection有如下问题:

  • 在设计时考虑了多种协议,但是现在几乎所有协议现已不存在。
  • API早于HTTP/1.1并且太抽象;
  • 使用很不友好;
  • 只能以阻塞模式工作;
  • 非常难维护;

JEP 323: Local-Variable Syntax for Lambda Parameters

在声明隐式类型的lambda表达式的形参时允许使用var。

动机
lamdba表达式可能是隐式类型的,它形参的所有类型全部靠推到出来的。隐式类型lambda表达式如下:
(x, y) -> x.process(y)
Java SE 10让隐式类型变量可用于本地变量:

var foo = new Foo();
for (var foo : foos) { ... }
try (var foo = ...) { ... } catch ...

为了和本地变量保持一致,我们希望允许var作为隐式类型lambda表达式的形参:
(var x, var y) -> x.process(y)
统一格式的一个好处就是modifiers和notably注解能被加在本地变量和lambda表达式的形参上,并且不会丢失简洁性:

@Nonnull var x = new Foo();
(@Nonnull var x, @Nullable var y) -> x.process(y)

//todo

说点什么

avatar
  Subscribe  
提醒

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部