一、过时的API

Java 9 废弃或者移除了几个不常用的功能,其中最主要的是Applet API,现在是标记为废弃的,随着对安全要求的提高,主流浏览器已取消对Java浏览器插件的支持。HTML5的出现也进一步加速了它的消亡。开发者现在可以使用像Java Web Start这样的技术来代替 Applet,它可以实现从浏览器启动应用程序或者安装应该程序。

同时,appletviewer工具也标记为废弃

二、Java 编译工具改进

智能Java编译工具(sjavac (Smart java complier)) 用于在多核处理器下提升JDK编译的速度,并取代了之前的JDK编译工具 javac ,继而成为Java环境默认的通用的智能编译工具。
同时,JDK 9 还更新了javac编译工具,才兼容低版本的JDK。

三、统一的JVM日志系统

日志是解决问题的唯一有效途径,曾经很难知道导致JVM性能问题和JVM崩溃的原因,不同的JVM的日志碎片化和日志选项(如JVM组件对于日志使用的是不同机制和规则),这使得JVM难以调试。
解决该问题最有效的方法:对所有的JVM组件引入一个单一的系统,这些JVM组件支持细粒度和易配置的JVM日志。

四、javadoc的 HTML5生成

可生成html5格式的javadoc。

五、javascript 引擎升级(Nashorn)

Nashorn 项目在JDK9中得到改进 ,它为Java 提供轻量级的Javascript运行时。Nashorn项目跟随Netscape 的Rhino 项目,目的是为了在java中实现一个高性能、轻量级的Javascript运行时,Nashorn 使得Java能够嵌入到Javascript,它在JDK 8 中为Java提供一个Javasciprt引擎。
JDK 9 中包含一个用于解析Nashorn的 ECMAScript 语法树的API,这个API使得IDE 和服务端框架不再需要依赖 Nashorn项目的内部实现类就可以分析 ECMAScript代码。

六、java动态编译器

Oracle 一直在努力提高Java启动和运行时的性能,希望其它能够在更多广泛的场景达到或接近本地语言的性能。但是,直到今天,谈到Java,很多C/C++开发者还是会不屑地评价为启动慢、吃内存等。

简单说,这主要是因为Java 编译器产生的类文件是Java虚拟机可以理解的二进制代码,而不是真正可执行的本地代码,需要Java虚拟机解释和编译,这带来了额外的开销。

JIT(Just-in-time) 编辑器可以在运行时将热点编译成本地代码,速度很快。但是Java项目现在变得很大很复杂,因此JIT 编译器需要花费较长时间 才能热身完成,而且有些Java方法还没法编译。性能方面也会下降。AOT 编辑器就是为了解决这些问题而生的

在JDK9中,AOT(AHead of Time Compliation) 作为实验特性被引入进来,开发者可以利用新的 jaotc 工具将重点代码转换成类似库一样的文件。虽然仍处于实验阶段,但这个功能使得Java应用在被虚拟机启动之前能够先将Java类编译为原生代码。此功能旨在改进小于和大型应用程序的启动时间,同时对峰值性能的影响很小。

但是Java技术供应商 Excelsior 的营销总监Dmitry Leskov 担心AOT编译技术不够成熟,希望Oracle 能够等到Java 10 时有个更稳定的版本才发布。

别外,JVMCI(Java Level JVM Compiler Interface) 等特性,对于整个编译器语言的发展,可能都具有非常重要的意义。目前GRaal COre API已被集成进入了JAVA 9 ,虽然还只是一小步,但完全用Java语言实现的可靠的、高性能的动态编译器似乎不再遥不可及,这是Java 虚拟机开发工程师的福音。

与此同时,随着 Truffle 框架 和 Substrate VM 的发展,已经让个另信心满满的工程师高呼 “One VM to Rule Them All !”,也许就在不远的将来 Ploygot 以一种另类的方式成为现实。

七、其它改进

  • I/O流新特性

java.io.InputStream 中增加了新的方法来读取和复制 InputStream 中包含的数据。

1
2
3
4
5
readAllBytes():读取 InputStream 中的所有剩余字节。

readNBytes(byte[] b,int off,int len): 从 InputStream 中读取指定数量的字节到数组中。

transferTo(OutputStream out):读取 InputStream 中的全部字节并写入到指定的 OutputStream 中 。
  • 多版本兼容 jar包:
    参考资料:
    http://openjdk.java.net/jeps/238
    https://segmentfault.com/a/1190000013584354

  • 垃圾收集机制
    Java 9 移除了在 Java 8 中 被废弃的垃圾回收器配置组合,同时把G1设为默认的垃圾回收器实现。替代了之前默认使用的Parallel GC,这项变更是很重要的,因为相对于Parallel来说,G1会在应用线程上做更多的事情,而Parallel几乎没有在应用线程上做任何事情,它基本上完全依赖GC线程完成所有的内存管理。这意味着切换到G1将会为应用线程带来额外的工作,从而直接影响到应用的性能。

  • 改进列表如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
102: Process API Updates
110: HTTP 2 Client
143: Improve Contended Locking
158: Unified JVM Logging
165: Compiler Control
193: Variable Handles
197: Segmented Code Cache
199: Smart Java Compilation, Phase Two
200: The Modular JDK
201: Modular Source Code
211: Elide Deprecation Warnings on Import Statements
212: Resolve Lint and Doclint Warnings
213: Milling Project Coin
214: Remove GC Combinations Deprecated in JDK 8
215: Tiered Attribution for javac
216: Process Import Statements Correctly
217: Annotations Pipeline 2.0
219: Datagram Transport Layer Security (DTLS)
220: Modular Run-Time Images
221: Simplified Doclet API
222: jshell: The Java Shell (Read-Eval-Print Loop)
223: New Version-String Scheme
224: HTML5 Javadoc
225: Javadoc Search
226: UTF-8 Property Files
227: Unicode 7.0
228: Add More Diagnostic Commands
229: Create PKCS12 Keystores by Default
231: Remove Launch-Time JRE Version Selection
232: Improve Secure Application Performance
233: Generate Run-Time Compiler Tests Automatically
235: Test Class-File Attributes Generated by javac
236: Parser API for Nashorn
237: Linux/AArch64 Port
238: Multi-Release JAR Files
240: Remove the JVM TI hprof Agent
241: Remove the jhat Tool
243: Java-Level JVM Compiler Interface
244: TLS Application-Layer Protocol Negotiation Extension
245: Validate JVM Command-Line Flag Arguments
246: Leverage CPU Instructions for GHASH and RSA
247: Compile for Older Platform Versions
248: Make G1 the Default Garbage Collector
249: OCSP Stapling for TLS
250: Store Interned Strings in CDS Archives
251: Multi-Resolution Images
252: Use CLDR Locale Data by Default
253: Prepare JavaFX UI Controls & CSS APIs for Modularization
254: Compact Strings
255: Merge Selected Xerces 2.11.0 Updates into JAXP
256: BeanInfo Annotations
257: Update JavaFX/Media to Newer Version of GStreamer
258: HarfBuzz Font-Layout Engine
259: Stack-Walking API
260: Encapsulate Most Internal APIs
261: Module System
262: TIFF Image I/O
263: HiDPI Graphics on Windows and Linux
264: Platform Logging API and Service
265: Marlin Graphics Renderer
266: More Concurrency Updates
267: Unicode 8.0
268: XML Catalogs
269: Convenience Factory Methods for Collections
270: Reserved Stack Areas for Critical Sections
271: Unified GC Logging
272: Platform-Specific Desktop Features
273: DRBG-Based SecureRandom Implementations
274: Enhanced Method Handles
275: Modular Java Application Packaging
276: Dynamic Linking of Language-Defined Object Models
277: Enhanced Deprecation
278: Additional Tests for Humongous Objects in G1
279: Improve Test-Failure Troubleshooting
280: Indify String Concatenation
281: HotSpot C++ Unit-Test Framework
282: jlink: The Java Linker
283: Enable GTK 3 on Linux
284: New HotSpot Build System
285: Spin-Wait Hints
287: SHA-3 Hash Algorithms
288: Disable SHA-1 Certificates
289: Deprecate the Applet API
290: Filter Incoming Serialization Data
292: Implement Selected ECMAScript 6 Features in Nashorn
294: Linux/s390x Port
295: Ahead-of-Time Compilation