原文檔地址: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數字。