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

部署JDK9的变化

1.弃用Java Plug-in
Oracle JDK9弃用Java Plug-in和相关的applet技术。这些技术虽然还可用,但是在将来的Oracle JDK/JRE中会考虑移除
嵌入在web页面的Applets和JavaFX应用运行时需要Java Plug-in。考虑将这些应用使用Java Web Start自包含的应用包进行重写。

2.增强的Java控制面板
改进了Java控制面板选项的分组和展示。更容易定位需要的信息,增加了搜索框,并弃用了模态对话框。某些配置选项的位置和之前版本会有不同。

3.模块化Java应用打包
集成Jigsaw项目到Java打包器。包括模块识别和自定义运行时创建。
使jlink来打更小的包。
创建只使用JDK9运行时的应用。该功能无法被用于之前版本JRE的打包。

4.弃用Applet API
弃用Applet API,随着浏览器停止支持Java浏览器插件,该API变得越来越少被使用。虽然JDK9中Applet类还存在,但将来会被移除。考虑将这些应用使用Java Web Start自包含的应用包进行重写。

JDK9中Java语言的更新

1.Milling Project Coin
一些小改动

  • 允许在私有实例方法上使用@SafeVarags
  • try-with-resources中允许使用有效的final变量作为resources
  • 允许钻石表达式应用于可识别泛型的匿名类
  • 禁止使用“_”作为变量名
  • 支持接口私有方法

JDK9中Javadoc的更新

1.简单的Doclet API
移除原有的Doclet API,使用新的简化的API,涉及其他标准和已有的API。标准doclet已使用新Doclet API重写

2.HTML5的javadoc
支持生成HTML5文档。完全支持HTML5,确保任何HTML内容都兼容HTML5。

3.Javadoc搜索
生成API文档上提供搜索框。使用该搜索框可以找到文档中的程序元素、打便签的单词和字段。

4.模块系统
模块声明支持文档注释。包含新的命令行参数用于配置模块的文档,并生成新的被记录的模块的汇总页面

JDK9中的JVM新特性

1.编译器控制
通过编译器直接参数提供控制JVM编译的方法。控制的程度是运行时管理和指定方法的。编译器控制取代了原有的编译命令,但也向后兼容的。

2.代码段缓存
将代码缓存分配到准确的段,每个段包含特定类型的编译过的代码,提升性能并可以用于未来的扩展。

3.动态链接语言定义对象模型
运行时动态链接高层面的对象操作给适当的目标方法,如读属性、写属性、触发方法。其基于传递的真实数据类型来链接这些操作到目标方法。这些对象操作称为invokedynamic。
当java.lang.invoke提供了底层API用于响应invokedynamic调用。其不会进行高层操作的调用,也不会调用其实现的方法。
有了jdk.dynalink包,你可以实现表达式包含动态类型(非静态类型)的语言并且其操作会变成invokedynamic调用(由于该对象模型或类型系统和JVM存在不同)

JDK9中JVM调优的更新

1.改进G1可用性、决策和性能
提升Garbage-First(G1)垃圾回收策略,自动决定多个重要的内存回收设置。之前这些设置需要手动配置来获得性能优化。此外修复了G1垃圾回收器的可用性和决策和性能

2.统一的JVM日志
为JVM所有组件引入通用日志系统。

3.移除JDK8中废除的GC组合
移除JDK8中废除的GC组合。
以下组合不会存在了:

  • DefNew+CMS
  • ParNew+SerialOld
  • 递增的CMS

“foregroud”模式下CMS也被移除。下面的命令也被移除

  • -Xincgc
  • -XX:+CMSIncrementalMode
  • -XX:+UseCMSCompactAtFullCollection
  • -XX:+CMSFullGCsBeforeCompaction
  • -XX:+UseCMSCollectionPassing

-XX:+UseParNewGC 不再生效。ParNew只会被用于CMS,CMS也只能用ParNew。因此-XX:+UseParNewGC被弃用,会在之后版本移除

4.G1成为默认垃圾回收策略
32/64位服务器版配置中,G1成为默认垃圾回收策略。使用低停顿时长的垃圾回收器如G1相较之前默认的流量优先的回收器如Parellel GC,能为大部分用户提供更好的体验。

5.同一的GC日志
使用JEP158的统一JVM日志框架重新实现了垃圾回收日志。垃圾回收日志保持现有的GC日志格式,但是新旧日志还是有些不同。

6.弃用CMS垃圾回收器
弃用CMS垃圾回收器。当在命令行指定 -XX:+UseConcMarkSweepGC时会有警告信息。G1垃圾回收器会取代大部分CMS的使用场景。

JDK9核心库的更新

1.进程操作API更新
增强控制和管理操作系统进程的API。
ProcessHandle类提供了进程原生的进程id、参数、命令、启动时间、CPU耗时、用户、父进程、子进程。该类也可以监控进程是否存活并销毁进程。通过ProcessHandle.onExit方法,CompletableFuture异步机制可以进行进程退出的处理。

2.变量操控
定义标准方法来在对象字段和数组元素上触发等价于java.util.concurrent.atomic和sun.misc.Unsafe的操作。
定义标准的栅栏(fence)操作,其中包含VarHandle静态方法用于细粒度控制内存顺序。这是sun.misc.Unsafe的替代方案,前者提供的栅栏操作都没有标准。
定义栅栏方法标准的访问性,确保引用对象保持高可访问性。

3.压缩字符串
字符串使用更加空间高效的内部表现形式。之前String保存字符在char数组中,每个字符使用两个字节(16位)。新的形式是byte数组加上编码标志字段。
这单纯是一个实现变更,对外接口没有任何变化。

4.平台日志API和服务
定义一个最小化的日志API,平台类可以用来日志消息,并且有一个服务接口给消费者进行消费。一个类库或应用可以提供一个服务的实现来路由平台日志消息到自选的日志框架中。日过没有自己实现,默认使用的基于{java.util.logging](https://docs.oracle.com/javase/9/docs/api/java/util/logging/package-summary.html) API的实现

5.更多concurrent的更新
增加JDK8中提到的将来的concurrent更新JEP 155: Concurrency Updates。包括可共同操作的公共订阅框架和增强的CompletableFutureAPI

6.XML类目
增加标准的XML类目API支持OASIS的XML类目v1.1标准。该API定义类目和类目解析器的抽象用于接受内部或外部的拥有JAXP处理器的解析器。
现存的使用内部类目API的类库或应用会需要移植到新的API来获得新功能的优势

7.方便的集合类工厂方法
更方便创建少量元素的集合、map实例。新的List、Set、Map的静态工厂方法可以更方便地创建集合的不可变实例
如:

Set<String> alphabet = Set.of("a", "b", "c");

8.增强的MethodHandle
增强的java.lang.invoke 包中的MethodHandle、MethodHandles、MethodHandles.Lookup类,便于常用的案例并获得更好的编译优化。
额外包括:

  • java.lang.invoke中的MethodHandles类,提供新的MethodHandle组合器用于循环和try/finally块。
  • 增强MethodHandle和MethodHandles类和新的MethodHandle组合器的参数处理。
  • 在MethodHandles.Lookup中实现方法和可选、父类构造器新的lookup方法。

9.增强的Depraecated
改进@Deprecated注解,提供更好的信息关于API的状态和计划。心增了两个元素:

  • @Deprecated(forRemoval=true)表示API会子将来Java SE版本中删除。
  • @Deprecated(since="version")表示弃用是从哪个Java SE版本弃用的,仅限Java 9和之后版本。

如@Deprecated(since="9", forRemoval=true)
@Deprecated注解在核心平台已经进行了更新。
可以使用新的工具jdeprscan来查看一个类(Jar文件)使用废弃JDK API的情况。

10.Spin-Wait提示
定义API,使Java代码了解spin循环正在执行。spin循环不停检测条件是否为真,如,当一个锁可以被获取,经过一些计算可以在释放锁的情况下运行。这个API单纯是提示,没有语义行为的需求。详见Thread.onSpinWait

11.过滤进入的序列化数据
允许对一些进入的序列化数据流进行过滤,提升安全和健壮性。对象序列化客户端可以更方便地验证数据流,并且导出的远程方法调用(RMI)对象也可以更方便地验证调用参数。
序列化客户端实现一个过滤器接口,可以配置在ObjectInputStream上。对于RMI,这个对象被通过RemoteServerRef暴露,在MarshalInputStream上配置过滤器,来在反序列化时验证调用参数。

12.栈路径API
提供一个栈路径API,可以方便地过滤和懒访问栈信息。
该API支持短路径以及长路径,前者在一个给定条件的帧处停止,后者会遍历整个路径。前者避免了校验所有信息的成本,调用者可能只关心顶层的帧。该API使得访问类对象的栈信息可配置。详见java.lang.Stackwalker

13.合并选用的Xerces 2.11.0更新到JAXP
更新JDK支持Xerces解析器v2.11.0。JAXP API的公共接口没有变化。
变化在Xerces2.11.0中:数据类型、DOM L3序列化器、XPointer、类目解析器、XML Schemaa验证(包括bug修复,但并非XML Schema 1.1开发代码)。