原文檔地址: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開發代碼)。