Java平台,标准版
Oracle JDK 9中的新增功能
版本9
E77563-05
2017年9月
JDK 9中的新功能概述
Java Platform,Standard Edition 9是一个主要的功能版本。以下总结了Java SE 9和JDK 9,Oracle Java SE 9实现中的功能和增强功能。
JDK增强提案(JEP)是对JDK设计和实施非常重要的更改的提案。参见JEP 1:JDK增强提案和路线图流程。Java规范请求(JSR)描述了Java平台的建议和最终规范。请参见JSR概述。
JDK 9中的重要变化
这些变化影响了多个技术领域。
特征 | 描述 |
Java平台模块系统 | 推出了一种新的Java编程组件,该模块是一个命名的,自描述的代码和数据集合。该模块系统: - 引入一个新的可选阶段,链接时间,它是编译时间和运行时间之间,在此期间,可以将一组模块组合和优化到自定义运行时映像中; 看到
jlink 在工具Java平台,标准版工具参考。 - 添加选项到工具
javac ,jlink 以及java 在哪里可以指定模块路径,定位模块的定义。 - 引入模块化JAR文件,它是一个JAR文件,其
module-info.class 文件位于根目录下。 - 推出JMOD格式,它是一种类似于JAR的打包格式,除了可以包括本机代码和配置文件; 看到这个
jmod 工具。 JDK本身已经被分为一组模块。这个变化: -
使您可以将JDK的模块组合到各种配置中,包括: - 对应于JRE和JDK的配置。
- 在Java SE 8中定义的每个紧凑型配置文件的内容大致相同的配置。
- 只包含一组指定的模块及其所需模块的自定义配置。
-
重新组织JDK和JRE运行时映像以适应模块,并提高性能,安全性和可维护性。 -
定义用于命名模块,类和存储在运行时映像中的资源的新URI方案,而不会显示图像的内部结构或格式。 -
删除经认可的标准覆盖机制和扩展机制。 -
删除rt.jar 和tools.jar Java运行时图像。 -
使大多数JDK的内部API默认无法访问,但留下一些关键的,广泛使用的内部API可访问,直到所有或大部分功能都支持替换。 运行该命令jdeps -jdkinternals 以确定您的代码是否使用内部JDK API。 有关详细信息,请参阅以下内容: |
JEP 223:新的版本串方案 | 提供简化的版本字符串格式,有助于清楚区分主要,次要,安全和补丁更新版本。 新版本的字符串格式如下: $MAJOR.$MINOR.$SECURITY.$PATCH -
$MAJOR 是主要版本增加的版本号,例如JDK 9,其中包含由Java SE平台规范指定的重要新功能。主要版本包含新功能和对现有功能的更改,这些功能将提前计划和公布。 -
$MINOR 是为每个次要更新增加的版本号,例如错误修复,标准API的修订,或相关平台规范范围之外的功能实现。 -
$SECURITY 是针对安全更新版本增加的版本号,其中包含关键修复程序,包括提高安全性所需的修补程序。 -
$PATCH 是包含已经一起测试的安全性和高优先级客户修补程序的版本的版本号。 见新版本字符串格式的Java平台,标准版安装指南。 |
JDK 9安装程序的新功能
JDK 9包括Microsoft Windows和MacOS平台的安装程序增强功能。
Microsoft Windows的安装程序增强功能
特征 | 描述 |
使用安装程序的用户界面启用或禁用Web部署 | 提供在安装程序的“ 欢迎”页面中启用或禁用Web部署的选项。要启用Web部署,请在“ 欢迎”页面中选择“ 自定义安装”,单击“ 安装”,然后选中“ 在浏览器中启用Java内容”复选框。 |
macOS的安装程序增强功能
特征 | 描述 |
CPU版本可用性 | 在卸载当前CPU版本后,提供关于下一个CPU可用性的通知。 |
用户体验 | 更新JRE时增强用户体验。 |
JDK 9中的工具的新功能
这些是JDK 9中的工具增强功能。
特征 | 描述 |
JEP 222:jshell:Java Shell(Read-Eval-Print Loop) | 将读评估打印循环(REPL)功能添加到Java平台。 该jshell 工具提供了一个交互式命令行界面,用于评估Java编程语言的声明,语句和表达式。它有助于原型设计和探索编码选项,具有即时的结果和反馈。直接的反馈结合开始表达的能力对于教育是有用的 - 无论是学习Java语言还是只学习新的API或语言功能。 见jshell 在Java平台,标准版工具参考,并介绍JShell在Java平台,标准版的Java壳牌用户指南。 JShell API使应用程序能够利用REPL功能。请参阅jdk.jshell包。 |
JEP 228:添加更多诊断命令 | 定义其他诊断命令,以提高诊断热点和JDK问题的能力。 见jcmd 在Java平台,标准版工具参考。 |
JEP 231:删除启动时JRE版本选择 | 删除请求JRE版本的能力,该版本不是在启动时启动的JRE。 现代应用程序通常通过Java Web Start(使用JNLP文件),本机OS打包系统或活动安装程序进行部署。这些技术有自己的方法来管理根据需要查找或下载和更新所需的JRE所需的JRE。这使得启动时间JRE版本选择过时。 |
JEP 238:多版本JAR文件 | 扩展JAR文件格式,以便在单个存档中共享多个Java版本的类文件。 多版本JAR(MRJAR)包含针对特定Java平台版本的类和资源的附加版本目录。使用jar 工具--release 选项指定版本化目录。 |
JEP 240:删除JVM TI hprof代理 | hprof 从JDK中删除代理。该hprof 剂被写为JVM工具界面演示代码,而不是旨在成为一种生产工具。 hprof 代理商的有用功能已被更好的替代品所取代。 注意: 当hprof 代理已被删除时,仍然可以hprof 使用jmap 或其他诊断工具的格式创建堆转储。见诊断工具在Java平台,标准版故障排除指南。 |
JEP 241:删除jhat工具 | jhat 从JDK中删除该工具。 该jhat 工具是JDK 6中添加的实验性和不受支持的工具。它已经过时了。高级堆可视化和分析仪已有多年可用。 |
JEP 245:验证JVM命令行标志参数 | 验证所有数值JVM命令行标志的参数以避免出现故障,如果发现它们无效,则会显示相应的错误消息。 已经为需要用户指定数值的参数实现了范围和可选约束检查。 在Java平台标准版工具参考中查看java 并验证Java虚拟机标志参数。 |
JEP 247:编译旧版平台版本 | 增强,javac 以便它可以编译Java程序以在所选的早期版本的平台上运行。 使用-source 或-target 选项时,编译的程序可能会意外地使用给定目标平台不支持的API。该--release 选项将防止意外使用API。 见javac 在Java平台,标准版工具参考。 |
JEP 282:jlink:Java连接器 | 组合并优化一组模块及其依赖关系到JEP 220中定义的自定义运行时映像。 该jlink 工具在组装过程中定义了用于转换和优化的插件机制,以及用于生成替代图像格式。它可以创建为单个程序优化的自定义运行时。JEP 261将链接时间定义为编译时间和运行时间之间的可选阶段。链接时间需要一个链接工具来组合和优化一组模块及其传递依赖关系以创建运行时映像或可执行文件。 见jlink 在Java平台,标准版工具参考。 |
JDK 9中的安全性新增功能
这些是JDK 9中的安全增强功能。
特征 | 描述 |
JEP 219:数据报传输层安全(DTLS) | 启用Java安全套接字扩展(JSSE)API和SunJSSE安全提供程序以支持DTLS版本1.0和DTLS版本1.2协议。 见数据报传输层安全(DTLS)在Java平台,标准版安全开发人员指南。 |
JEP 244:TLS应用层协议协商扩展 | 使传输层安全(TLS)连接中的客户端和服务器协商要使用的应用协议。使用应用层协议协商(ALPN),客户端将作为TLS ClientHello消息的一部分发送支持的应用协议列表。服务器选择协议,并将所选协议作为TLS ServerHello消息的一部分返回。应用协议协商可以在TLS握手中完成,而不需要添加网络往返。 见TLS握手和应用层协议协商的Java平台,标准版安全开发人员指南。 |
JEP 249:用于TLS的OCSP装订 | 启用TLS连接中的服务器以检查撤销的X.509证书撤销。服务器在TLS握手期间通过联系有关证书的在线证书状态协议(OCSP)响应者来执行此操作。然后,它将撤销信息附加或“订购”到其返回给客户端的证书,以便客户端可以采取适当的措施。 使客户端能够从TLS服务器请求OCSP装订。客户端检查来自支持该功能的服务器的装订响应。 见OCSP装订在Java平台,标准版安全开发人员指南。 |
JEP 246:利用GHASH和RSA的CPU指令 | AES/GCM/NoPadding 使用GHASH HotSpot内在函数提高性能,范围从34x到150x 。PCLMULQDQ 英特尔x64 CPU上的xmul/xmulhi 指令和SPARC 上的说明加速了GHASH内在函数。 使用RSA HotSpot内在函数提高性能高达50%的方法BigInteger squareToLen 和BigInteger mulAdd 方法。RSA内在函数适用java.math.BigInteger 于Intel x64上的类。 jdk.security.provider.preferred 引入了新的安全属性来配置提供特定算法提供显着性能提升的提供商。 请参阅在Java平台,标准版安全开发人员指南中配置特定算法的首选提供程序。 |
JEP 273:基于DRBG的SecureRandom实现 | 提供API 中NIST SP 800-90Ar1中规定的确定性随机位发生器(DRBG)机制的SecureRandom 功能。 DRBG机制使用与SHA-512和AES-256一样强大的现代算法。这些机制中的每一个都可以配置不同的安全强度和功能,以匹配用户需求。 请参阅在Java平台生成随机数字,标准版安全开发人员指南。 |
JEP 288:禁用SHA-1证书 | 通过提供更灵活的机制,通过基于SHA-1的签名来禁用X.509证书链来改进JDK的安全配置。 禁用在默认情况下包含在JDK中的由根链接的TLS服务器证书链中的SHA-1; 本地或企业认证机构(CA)不受影响。 在jdk.certpath.disabledAlgorithms 安全性能与几个新的约束,允许在可禁用的证书类型更大的控制增强。 见JEP 288。 |
JEP 229:默认创建PKCS12密钥库 | 将默认密钥库类型从JKS修改为PKCS12。PKCS#12是一种可扩展,标准和广泛支持的存储加密密钥的格式。PKCS12密钥库通过存储私钥,可信公钥证书和密钥来提高机密性。此功能还为与其他系统(如Mozilla,Microsoft的Internet Explorer和支持PKCS12的OpenSSL)的互操作性打开了机会。 SunJSSE提供商提供java.security.KeyStore 用于读取和写入PKCS12文件的PKCS12 格式的完整实现。 见密钥管理的Java平台,标准版安全开发人员指南。 该keytool 密钥和证书管理实用程序可以创建PKCS12密钥库。 请参阅创建密钥库在Java平台,标准版安全开发人员指南和keytool 在Java平台,标准版工具参考。 |
JEP 287:SHA-3哈希算法 | 支持NIST FIPS 202中指定的SHA-3加密散列函数。 java.security.MessageDigest API 支持以下附加标准算法:SHA3-224,SHA3-256,SHA3-384和SHA3-512。 以下提供商支持SHA-3算法增强功能: |
JDK 9中部署的新功能
这些是JDK 9中的部署增强功能。
JDK 9中Java语言的新特性
Java SE 9中包含了一些非常小的语言更改。
特征 | 描述 |
JEP 213:铣削项目硬币 | 标识一些小的变化: -
允许@SafeVargs 私有实例方法。 -
允许有效地将最终变量用作try-with-resources 语句中的资源。 -
如果推断类型的参数类型是可表示的,则允许具有匿名类的菱形。 -
完成从Java SE 8开始的从法定标识符名称集合中下划线的删除。 -
添加对私有接口方法的支持。 见Java语言更改为Java SE 9在Java平台,标准版的Java语言的更新。 |
JDK 9中Javadoc的新功能
Javadoc增强功能包括以下内容:简化的Doclet API,Javadoc搜索,支持生成HTML5输出以及支持模块系统中的文档注释。
JDK 9中JVM的新特性
这些是JDK 9中的JVM增强功能。
特征 | 描述 |
JEP 165:编译器控制 | 提供通过编译器指令选项控制JVM编译的方法。控制级别是运行时可管理的和方法特定的。编译器控件取代了CompileCommand并向后兼容。 见编译器控制的Java平台,标准版Java虚拟机向导。 |
JEP 197:分段代码缓存 | 将代码高速缓存分成不同的段,每个段都包含特定类型的编译代码,以提高性能并启用未来的扩展。 见java 在Java平台,标准版工具参考。 |
JEP 276:语言定义对象模型的动态链接 | 在运行时动态链接高级对象操作,例如读取属性,编写属性和调用函数到相应的目标方法句柄。它根据传递的值的实际类型将这些操作链接到目标方法句柄。这些对象操作表示为invokedynamicsites。 虽然java.lang.invoke提供了一个用于动态链接invokedynamic调用站点的低级API ,但它并没有提供一种方法来表达对象的更高级别操作,也不提供实现它们的方法。 使用包jdk.dynalink,您可以实现其表达式包含动态类型(无法静态确定的类型)的编程语言,并将这些动态类型的操作表示为invokedynamic调用站点(因为语言的对象模型或类型系统不会紧密匹配JVM)。 |
JDK 9中JVM调优的新功能
这些是JDK 9中的JVM调优增强功能。
特征 | 描述 |
提高G1的可用性,确定性和性能 | 增强垃圾回收(G1)垃圾收集器,自动确定几个重要的内存回收设置。以前,必须手动设置这些设置才能获得最佳结果。此外,还解决了G1垃圾收集器的可用性,确定性和性能问题。 |
JEP 158:统一JVM记录 | 为JVM的所有组件引入通用日志记录系统。 请参阅Java Platform,Standard Edition Tools Reference中的-Xloggc java 选项。 |
JEP 214:删除JDK 8中不推荐使用的GC组合 | 删除在JDK 8中不推荐使用的垃圾收集器(GC)组合。 这意味着以下GC组合不再存在: -
DefNew + CMS -
ParNew + SerialOld -
增量CMS 同时标记扫描(CMS)的“前景”模式也已被删除。以下命令行标志已被删除: -Xincgc -XX:+CMSIncrementalMode -XX:+UseCMSCompactAtFullCollection -XX:+CMSFullGCsBeforeCompaction -XX:+UseCMSCollectionPassing 命令行标志-XX:+UseParNewGC 不再有效果。ParNew只能与CMS一起使用,CMS需要ParNew。因此,该-XX:+UseParNewGC 标志已被弃用,将来可能会被删除。 |
JEP 248:使G1成为默认垃圾收集器 | 在第32和64位服务器配置上,首先使用垃圾回收(G1)默认垃圾收集器(GC)。使用诸如G1之类的低暂停收集器为大多数用户提供比面向吞吐量的收集器(例如以前是默认值的Parallel GC)更好的整体体验。 见垃圾首先垃圾收集器在Java平台,标准版的HotSpot虚拟机垃圾收集调优指南 |
JEP 271:统一GC记录 | 使用JEP 158中引入的统一JVM日志记录框架对垃圾收集(GC)进行日志记录。GC记录以与当前GC记录格式一致的方式重新实现; 然而,新旧格式之间存在一些差异。 请参阅使用JVM统一日志记录框架在Java平台,标准版工具参考中启用日志记录。 |
JEP 291:弃用并发标记扫描(CMS)垃圾收集器 | 不推荐使用并发标记扫描(CMS)垃圾回收器。使用该-XX:+UseConcMarkSweepGC 选项在命令行上请求时发出警告消息。垃圾回收(G1)垃圾收集器旨在替代大多数CMS使用。 |
JDK 9中核心库的新功能
特征 | 描述 |
JEP 102:进程API更新 | 改进用于控制和管理操作系统进程的API。 所述ProcessHandle类提供的过程的本机过程ID,自变量,命令,开始时间,累积CPU时间,用户,父进程,和后代。该类还可以监视进程的活动并销毁进程。使用ProcessHandle.onExit方法,CompletableFuture类的异步机制可以在进程退出时执行一个操作。 见进程API的Java平台,标准版Java的核心库开发指南,java.lang.Process中,和java.lang.ProcessHandle。 |
JEP 193:可变手柄 | 定义一个标准的方法来调用对象字段和数组元素上的java.util.concurrent.atomic和sun.misc.Unsafe操作的等价物。 定义一组标准的围栏操作,由VarHandle静态方法组成,可以对内存排序进行细粒度的控制。这是sun.misc.Unsafe的替代方法,它提供了一组非标准的围栏操作。 定义标准可达性围栏操作,以确保引用的对象保持强力可访问。 |
JEP 254:紧凑型串 | 对字符串采用更节省空间的内部表示。以前,String类在char数组中存储字符,每个字符使用两个字节(16位)。String类的新内部表示是一个字节数组加上一个编码标志字段。 这完全是一种实现变更,而不改变现有的公共接口。 请参阅Java Platform,Standard Edition Tools ReferenceCompactStrings 中的java 命令选项。 |
JEP 264:平台日志API和服务 | 定义平台类可用于记录消息的最小记录API,以及消息者的服务接口。库或应用程序可以提供此服务的实现,将平台日志消息路由到其选择的日志记录框架。如果没有提供实现,则使用基于java.util.logging API 的默认实现。 |
JEP 266:更多并发更新 | 为JEP 155中的JDK 8中引入的并发更新进一步并发更新:并发更新,包括可互操作的发布 - 订阅框架和对CompletableFuture API的增强。 |
JEP 268:XML目录 | 添加标准XML目录API,该API支持结构化信息标准(OASIS)XML目录1.1版标准的组织。API定义了目录和目录解析器抽象,可以用作内部或外部解析器,JAXP处理器可以接受解析器。 使用内部目录API的现有库或应用程序将需要迁移到新的API以利用新功能。 见XML目录API的Java平台,标准版Java的核心库开发人员指南。 |
JEP 269:集合的便利工厂方法 | 使用少量元素创建集合和映射的实例更容易。对于List ,,Set 和Map 接口,新的静态工厂方法使得创建这些集合的不可变实例变得更为简单。 例如: Set<String> alphabet = Set.of(“a”,“b”,“c”); 请参阅在Java平台“标准版Java核心库开发人员指南”中创建不可变的列表,集合和映射。有关API文档,请参阅不可变静态工厂方法,不可变图静态工厂方法和不可变列表静态工厂方法。 |
JEP 274:增强方法句柄 | 增强java.lang.invoke包的MethodHandle,MethodHandles和MethodHandles.Lookup类,以简化常见的用例并实现更好的编译器优化。 补充包括: -
在java.lang.invoke包中的MethodHandles类中,为循环和try / finally块提供新的MethodHandle组合器。 -
使用新的MethodHandle组合器来增强MethodHandle和MethodHandles类的参数处理。 -
在MethodHandles.Lookup类中实现接口方法和可选的超级构造函数的新查找。 |
JEP 277:增强弃用 | 修改@Deprecated注释,以提供有关规范中API的状态和预期配置的更好信息。增加了两个新元素: 例如:@Deprecated(since =“9”,forRemoval = true) @核心平台中的已删除注释已更新。 您可以使用新工具jdeprscan 来扫描类库(JAR文件),以使用已弃用的JDK API元素。 见增强弃用的Java平台,标准版Java的核心库开发人员指南。 见jdperscan 在Java平台,标准版工具参考。 |
JEP 285:旋转等待提示 | 定义一个API,使Java代码能够提示自旋循环正在执行。旋转循环重复检查条件是否为真,例如可以获取锁定,之后可以安全地执行一些计算,然后释放锁定。这个API纯粹是一个提示,并且没有语义行为的要求。看到Thread.onSpinWait的方法。 |
JEP 290:过滤进入的序列化数据 | 允许对对象序列化数据的传入流进行过滤,以提高安全性和鲁棒性。对象序列化客户端可以更容易地验证其输入,并且导出的远程方法调用(RMI)对象也可以更容易地验证调用参数。 序列化客户端实现在ObjectInputStream上设置的过滤器接口。对于RMI,通过RemoteServerRef导出对象,该RemoteServerRef将MarshalInputStream上的过滤器设置为在未调用时验证调用参数。 |
JEP 259:Stack-Walking API | 提供了一个堆栈行走API,允许轻松过滤和懒惰地访问堆栈跟踪中的信息。 该API支持两个短步,停止在与给定条件匹配的框架上,以及遍历整个堆栈的漫步。在符合给定标准的帧上停止,如果调用者只对堆栈中的顶部帧感兴趣,则避免检查所有帧的成本。当堆栈步行器配置为这样做时,API可以访问Class对象。请参阅java.lang.Stackwalker类。 |
JEP 255:合并所选Xerces 2.11.0更新到JAXP | 更新JDK以支持2.11.0版本的Xerces解析器。公共JAXP API没有变化。 更改在Xerces 2.11.0的以下类别中:数据类型,DOM L3序列化程序,XPointer,目录解析器和XML模式验证(包括错误修复,但不是XML模式1.1开发代码)。 |
Nashorn在JDK 9中的新功能
这些是JDK 9中的Nashorn增强功能。
JDK 9中客户端技术的新功能
这些是JDK 9中的客户端技术增强功能。
JDK 9中的国际化新进展
这些是JDK 9中的国际化增强。
文档辅助功能
有关Oracle对可访问性的承诺的信息,请访问Oracle辅助功能计划网站:http://www.oracle.com/pls/topic/lookup ? ctx=acc& id=docacc。
访问Oracle支持
购买支持的Oracle客户可以通过My Oracle Support获得电子支持。有关信息,请访问http://www.oracle.com/pls/topic/lookup?ctx=acc&id=info或访问http://www.oracle.com/pls/topic/lookup?ctx=acc&id=trs如果您听力障碍者