千呼万唤,JDK11于2018-09-25正式发布GA版本(GA即General Availability,也就是官方推荐能够普遍使用的版本),其中发布了包括ZGC、Flight Recorder等17个新特性,让咱们一睹为快。
日期 | 阶段 | 说明 |
---|---|---|
2018/06/28 | Rampdown Phase One (fork from main line) | 对进入Rampdown阶段的变化会应用愈来愈严格的审查。在阶段1中,只能修复 P1-P3 错误。 |
2018/07/26 | Rampdown Phase Two | 在阶段2中,只能修复 showstopper 错误 |
2018/08/16 | Initial Release Candidate | |
2018/08/30 | Final Release Candidate | 在此阶段必须宣布最终候选版的发布日期并提交以进行测试 |
2018/09/25 | General Availability | 最终版本,可在生产环境正式使用 |
Java的类型文件格式将被拓展,支持一种新的常量池格式:CONSTANT_Dynamic,加载CONSTANT_Dynamic会将建立委托给bootstrap方法。java
其目标是下降开发新形式的可实现类文件约束带来的成本和干扰。git
JDK上对这个特性的描述是:开发一个处理内存分配但不实现任何实际内存回收机制的GC,一旦可用堆内存用完,JVM就会退出。程序员
若是有System.gc()的调用,实际上什么也不会发生(这种场景下和-XX:+DisableExplicitGC效果同样),由于没有内存回收,这个实现可能会警告用户尝试强制GC是徒劳。github
用法很是简单:算法
-XX:+UseEpsilonGC。
提供彻底被动的GC实现,具备有限的分配限制和尽量低的延迟开销,但代价是内存占用和内存吞吐量。bootstrap
众所周知,Java实现可普遍选择高度可配置的GC实现。 各类可用的收集器最终知足不一样的需求,即便它们的可配置性使它们的功能相交。 有时更容易维护单独的实现,而不是在现有GC实现上堆积另外一个配置选项。api
它的主要用途以下:缓存
Java EE和CORBA两个模块在JDK9中已经标记"deprecated",在JDK11中正式移除。JDK中deprecated的意思是在不建议使用,在将来的release版本会被删除。安全
JavaEE由4部分组成:并发
可是这个特性和JavaSE关系不大。而且JavaEE被维护在Github(https://github.com/javaee)中,版本同步形成维护困难。最后,JavaEE能够单独引用,maven中心仓库也提供了JavaEE(http://mvnrepository.com/arti...),因此不必把JavaEE包含到JavaSE中。
至于CORBA,使用Java中的CORBA开发程序没有太大的兴趣。所以,在JavaEE就把CORBA标记为"Proposed Optional",这就代表未来可能会放弃对这些技术的必要支持。
将JDK9引进并孵化的HTTP客户端API做为标准,即HTTP/2 Client。它定义了一个全新的实现了HTTP/2和WebSocket的HTTP客户端API,而且能够取代HttpURLConnection。
动机
已经存在的HttpURLConnection有以下问题:
在声明隐式类型的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)
用RFC 7748中描述到的 Curve25519 和Curve448 实现秘钥协议。RFC 7748定义的秘钥协商方案更高效,更安全。这个JEP的主要目标就是为这个标准定义API和实现。
密码学要求使用 Curve25519 和Curve448 是由于它们的安全性和性能。JDK会增长两个新的接口XECPublicKey 和 XECPrivateKey,示例代码以下:
KeyPairGenerator kpg = KeyPairGenerator.getInstance("XDH"); NamedParameterSpec paramSpec = new NamedParameterSpec("X25519"); kpg.initialize(paramSpec); // equivalent to kpg.initialize(255) // alternatively: kpg = KeyPairGenerator.getInstance("X25519") KeyPair kp = kpg.generateKeyPair(); KeyFactory kf = KeyFactory.getInstance("XDH"); BigInteger u = ... XECPublicKeySpec pubSpec = new XECPublicKeySpec(paramSpec, u); PublicKey pubKey = kf.generatePublic(pubSpec); KeyAgreement ka = KeyAgreement.getInstance("XDH"); ka.init(kp.getPrivate()); ka.doPhase(pubKey, true); byte[] secret = ka.generateSecret();
更新平台API支持Unicode 10.0版本(Unicode 10.0概述:Unicode 10.0 增长了8518 个字符, 总计达到了136,690个字符. 而且增长了4个脚本, 总结139个脚本, 同时还有56个新的emoji表情符号。参考:http://unicode.org/versions/U...)。
Unicode是一个不断进化的工业标准,所以必须不断保持Java和Unicode最新版本同步。
提供一个低开销的,为了排错Java应用问题,以及JVM问题的数据收集框架,但愿达到的目标以下:
排错,监控,性能分析是整个开发生命周期必不可少的一部分,可是某些问题只会在大量真实数据压力下才会发生在生产环境。
Flight Recorder记录源自应用程序,JVM和OS的事件。 事件存储在一个文件中,该文件能够附加到错误报告中并由支持工程师进行检查,容许过后分析致使问题的时期内的问题。工具可使用API从记录文件中提取信息。
实现RFC 7539中指定的 ChaCha20 和 ChaCha20-Poly1305 两种加密算法。
惟一一个其余普遍采用的RC4长期以来一直被认为是不安全的,业界一致认为当下ChaCha20-Poly1305是安全的。
加强Java启动器支持运行单个Java源代码文件的程序。
单文件程序是指整个程序只有一个源码文件,一般是早期学习Java阶段,或者写一个小型工具类。以HelloWorld.java为例,运行它以前须要先编译。咱们但愿Java启动器能直接运行这个源码级的程序:
java HelloWorld.java
等价于:
javac -d <memory> HelloWorld.java java -cp <memory> helloWorld java Factorial.java 3 4 5
等价于:
javac -d <memory> Factorial.java java -cp <memory> Factorial 3 4 5
到JDK10为止,Java启动器能以三种方式运行:
JDK11再加一个,即第四种方式:启动一个源文件申明的类。
提供一种低开销的Java堆分配采样方法,获得堆分配的Java对象信息,可经过JVMTI访问。但愿达到的目标以下:
动机
对用户来讲,了解它们堆里的内存是很重要的需求。目前有一些已经开发的工具,容许用户窥探它们的堆,好比:Java Flight Recorder, jmap, YourKit, 以及VisualVM tools.。可是这工具都有一个很大的缺点:没法获得对象的分配位置。headp dump以及heap histo都没有这个信息,可是这个信息对于调试内存问题相当重要。由于它能告诉开发者,他们的代码发生(尤为是坏的)分配的确切位置。
实现TLS协议1.3版本。(TLS容许客户端和服务端经过互联网以一种防止窃听,篡改以及消息伪造的方式进行通讯)。
TLS 1.3是TLS协议的重大改进,与之前的版本相比,它提供了显着的安全性和性能改进。其余供应商的几个早期实现已经可用。咱们须要支持TLS 1.3以保持竞争力并与最新标准保持同步。这个特性的实现动机和Unicode 10同样,也是紧跟历史潮流。
ZGC:这应该是JDK11最为瞩目的特性,没有之一。可是后面带了Experimental,说明还不建议用到生产环境。看看官方对这个特性的目标描述:
GC是Java主要优点之一。然而,当GC停顿太长,就会开始影响应用的响应时间。消除或者减小GC停顿时长,Java将对更普遍的应用场景是一个更有吸引力的平台。此外,现代系统中可用内存不断增加, 用户和程序员但愿JVM可以以高效的方式充分利用这些内存,而且无需长时间的GC暂停时间。
ZGC一个并发,基于region,压缩型的垃圾收集器,只有root扫描阶段会STW,所以GC停顿时间不会随着堆的增加和存活对象的增加而变长。
ZGC和G1停顿时间比较:
ZGC avg: 1.091ms (+/-0.215ms) 95th percentile: 1.380ms 99th percentile: 1.512ms 99.9th percentile: 1.663ms 99.99th percentile: 1.681ms max: 1.681ms G1 avg: 156.806ms (+/-71.126ms) 95th percentile: 316.672ms 99th percentile: 428.095ms 99.9th percentile: 543.846ms 99.99th percentile: 543.846ms max: 543.846ms
用法:
-XX:+UnlockExperimentalVMOptions -XX:+UseZGC
由于ZGC还处于实验阶段,因此须要经过JVM参数UnlockExperimentalVMOptions 来解锁这个特性。
参考: http://openjdk.java.net/proje...