原文档地址:What’s New in Oracle JDK 9 Release 9

JDK9中的主要变化

变化影响了多个技术领域
1.Java平台模块系统
引入新的java编程组件,模块(module),其是一个命名的自描述的代码和数据的结合:

  • 在编译和运行之间映入新的“连接”阶段,在这段时间,一系列模块可以被组装和优化成为自定义的运行时镜像,详见jlink工具。
  • 在javac、jlink、java命令中增加额外参数用于指定所定义模块的路径。
  • 引入模块化jar包,它与其他jar包的区别是在其根目录上有一个module-info.class文件。
  • 映入JMOD格式,这是一打包形式,类似于JAR,区别是其可以包括原生代码和配置文件,详见jmod
    JDK自身也被分为一系列模块,该变化可以:
  • 让用户将jdk的模块和不同的配置进行组合:JRE、JDK对应的配置;与JDK8中[Compact Profiles]相同的配置;自定特定及所需的模块。
  • 重铸JDK和JRE的运行时用于适应模块并提升性能、安全和维护性。
  • 定义新的URI结构用于命名运行时镜像中的模块、类和资源,而不用泄露镜像内部的结构或格式。
  • 移除保证的覆盖机制和扩展机制
  • 从java运行时镜像中移除rt.jar和tools.jar
  • 让大部分JDK的内部API默认不可访问,但部分重要和广泛使用的内部API知道出现替代方法前可被访问
    运行jdeps -jdkinternals来判断你的代码是否使用了内部JDK API

2.JEP 223:新的版本字符串结构
提供一个简化的版本字符串格式,用于明确不同的主要、次要、安全、补丁升级版本。
新的版本格式为
$主版本.$次要版本.$安全.$补丁升级版本。

  • $主版本 是主要的发布号,如JDK9,其中包含了JavaSE平台规范中提出的明显的新功能。一个主要版本包括新功能和现有功能的改变,这些变化会进行事先计划和发布。
  • $次要版本 会随着次要升级递增,如bug修复、标准API修订或实现平台规范外的功能。
  • $安全 随着安全升级递增,包含提升安全性必要的关键修复
  • $补丁升级 随着经过测试的安全和高优先级用户修复而递增

JDK9安装器的更新

主要为微软和macOS平台的更新

微软侧:

1.安装器UI的Web部署的启用和禁用
在安装器的欢迎界面提供了选项用于启用、禁用网络部署,选择自定义设置,点击安装并选择启用浏览器中的Java内容复选框

macOS侧:

1.CPU版本可用性
卸载当前CPU版本时提示下一个可用CPU

2.用户体验
升级JRE时增强用户

JDK9中工具的更新

1.jshell(REPL的java shell)
增加Java平台的REPL功能
jshell工具提供了交互式的接口用户运行java的定义、语句和表达式。其可以通过立即返回结果用于让用户尝试和探索编码选项。立即返回的功能便于教学,无论是学习java语言,或只是学习心得api或语言特性。

2.增加更多诊断性命令
定义额外的诊断命令,用于诊断Hotspot和JDK的问题。

3.移除启动时JRE版本选择
移除请求非启动JRE版本的其他版本JRE
现代化应用一般通过Java Web Start(其中包含JNPL)、原生OS打包系统或安装器进行部署。这些技术有自己的方法用于管理、所需的JRE,包括查找、下载、升级所需的JRE。这就让JRE的版本选择显得无用。

4.支持多版本的Jar包
扩展Jar包,使同一个文件支持多版本Java
一个多版本支持Jar(MRJAR)包含额外的版本化的目录存放类和资源,用于支持不同版本。通过jar命令的--release列出版本化的目录。

5.移除JVM TI hprof代理
移除hprof代理
hprof是一个JVM工具接口的示例代码,而非生产可用代码。
hprof代理有用的功能有了更好的替代

hprof虽然被移除但还可以同功能jmap或其他工具获得堆的dump

6.移除jhat
移除jhat工具
jhat是JDK6增加的实验性工具。其已经过时,高级的堆可视化和分析工具已出现很长时间。

7.验证jvm命令行标志参数
验证所有数字的JVM参数,防止失败或显示不恰当的错误信息。
用户指定的数字类型参数增加了输入范围和可选的约束检测。

8.编译就平台版本
增强javac,使其可以编译java程序在之前的版本运行。
当使用-source或-target选项,编译代码会使用目标平台不支持的api,而使用--release则可以避免这点。

9.jlink-java的连接器
组装和优化模块和他们的依赖到一个自定义的运行时镜像(JEP 220)。
jkink定义了一个插件式机制,用于在组装过程中或生成不同镜像格式时进行转化和优化。其可以创建一个针对单个项目的自定义的运行时优化。JEP 261定义连接为编译和运行间可选的阶段。连接时需要一个连接工具来组装和优化一系列模块和他们的过渡依赖,来创建运行时镜像或可执行文件。

JDK9安全的更新

1.数据报文传输层安全(DTLS)
java安全套接字扩展(JSSE)API和SunJSSE安全提供方支持1.0和1.2版本的DTLS协议。

2.TLS应用层协议协商扩展
客户端和服务端子TLS连接协商使用的应用协议。通过应用层协议协商(ALPN),客户端在TLS客户端Hello消息中发送支持的协议。服务端早TLS服务端Hello消息中选择并返回所选协议。应用协议协商可以自TLS握手中实现,而无需额外网络通讯。

3.TLS的OCSP Stapling
TLS连接的服务器端检查撤销的X.509证书撤销。服务端在TLS握手阶段通过与在线证书状态协议(OCSP)应答者通讯来获得证书。之后追加或标注证书撤销信息返回给客户端,客户端可以采取适当的措施。
让客户端可以从TLS服务器请求OCSP stapling。客户端检查从支持该功能的服务器获得标注过的返回。

4.提升GHASH和RSA的CPU指令
通过GHASH HotSpot内在函数,提升34-150倍AES/GCM/NoPadding的性能。GHASH内在函数通过PCLMULQDQ在Intel x64CPU和SPARC的xmul/xmulhi架构加速。
通过RSA HotSpot内在函数提升最大50% BigInteger的squareToLen和mulAdd的性能。RSA内在函数应用于Intel x64的java.math.BigInteger类上。
引入一个新的安全提供者jdk.security.provider.preferred,用于配置提供对特定算法进行明显性能优化的提供者。

5.基于DRBG的安全随机数实现
提供NIST SP 800-90Ar1,SecureRandom API中的决定随机bit生成器(DRBG)的功能。
DRBG机制使用现代算法,和SHA-512、AES-256一样健壮。每个机制都可以和不同的安全强度和特性被配置,用于达到用户需求。

6.禁用SHA-1证书
提升安全JDK的配置,提供更灵活的机制禁用基于SHA-1签名的X.509证书链。
禁用SHA-1在TLS服务端JDK默认包含的证书链,本地或企业证书提供者(CA)不受影响。
jdk.certpath.disabledAlgorithms属性有许多新限制,可以更好控制可被禁用的证书类型。

7.默认创建PKCS12 KeyStores
将默认的keystore类型从JKS换成PKCS12。PKCS#12是一个可扩展、标准化、广泛被支持的保存秘钥的形式。PKCS12 keytore通过保存私钥、信任的公钥和秘钥,提升了安全性。该特性也使互用其他系统成为可能,如支持PKCS12的Mozilla、Microsoft的IE和OpenSSL。
SunJSSE提供者支持完整的PKCS12 java.security.KeyStore实现用于读写PKCS12文件。
keytool的秘钥和从、证书管理工具可以生成PKCS12 keystore。

8.SHA-3哈希算法
支持NIST FIPS 202描述的SHA-3加密哈希功能。
java.security.MessageDigest API支持下面额外的标准算法:SHA3-224、SHA3-256、SHA3-384和 SHA3-512。
下面的提供者支持SHA-3算法增强

  • SUN提供者:SHA3-224、SHA3-256、SHA3-384和SHA3-512。
  • OracleUcrypto提供者:Solris 12.0支持的SHA-3数字。