天天看點

JAVA16版本.JDK16即将釋出,你準備好了嗎?

歲月無聲,歲月有聲.2020實鼠不易,2021牛轉乾坤。 當我們開發者與大多企業還停留在JDK8的時候,JDK16即将問世,你準備好了嗎?

鄭重申明:

​第一次冒險翻譯專業領域的文獻,可想而知,效果特别糟糕。一般翻譯文獻特别是 技術專業領域 的内容,因為涉及到很多專業術語、業内常用語,很多詞彙你在翻譯軟體根本找不到,并且大部分知識點技術都是成體系的、互相關聯的、多版本疊代的、有曆史原因的等等,是以要求你本身必須清楚每個技術點的前因後果和邏輯關系,否則翻譯起來特别耗費時間精力,因為不斷翻閱參考文獻了解學習和推敲揣摩,但其實徒勞無功,因為很多你到最後還是沒看明白。而此次翻譯的 JDK 16 新特性 文獻内容,确實是難上之難。​

前言

到2021年3月,下一版本的 Java 更新釋出将聚焦在原始類、密封類、記錄類、矢量類接口,以及用于 Windows ARM64 和 Alpine Linux 的端口上。

JDK 16 新增了基于值的類警告和密封類(第二次預覽)作為計劃功能,還加入了一系列新的特性,從外部連結程式API,到模式比對,再到用于垃圾回收的并發線程堆棧處理。

JDK 16 将是繼9月15日釋出的 JDK 15 之後,一個标準的 Java 版本參考實作。拟定釋出計劃是在2020年12月10日和2021年1月14日分别兩次進入提案當機階段,随後在2021年2月4日和2月18日釋出兩個預覽版本。生産版本預計在2021年3月16日正式釋出。

縱觀 JDK 史 :

JDK 1.0
    1996-01-23 釋出

JDK 1.1
    1997-02-19 釋出

JDK 1.2
    1998-12-04 釋出

JDK 1.3
    2000-05-08 釋出

JDK 1.4
    2002-02-13 釋出
    正規表達式,異常鍊,NIO,日志類,XML解析器,XLST 轉換器

JDK 1.5/5.0
    2004-09-30 釋出
    自動裝箱、泛型、動态注解、枚舉、可變長參數、周遊循環

JDK 1.6/6.0
    2006-04 提供動态語言支援、提供編譯 API 和衛星 HTTP 伺服器 API,改進 JVM 的鎖,同步垃圾回收,類加載

JDK 1.7/7.0
    2011-07-28 釋出
    提供GI回收器、加強對非Java語言的調用支援(JSR-292,更新類加載架構

JDK 1.8/8.0
    2014-03-18 釋出
    Lambda 表達式、方法引用、預設方法、新工具、Stream API、Date Time API 、Optional 類、Nashorn, JavaScript 引擎

JDK 9.0
    2017-09-21 釋出
    JShell、不可變集合工廠方法、子產品系統、http協定2.0版本、Process API/CompletableFuture API/Optional Class/Stream API增強、匿名内部類的鑽石操作符、預設G1垃圾回收器、try語句文法改進

JDK 10.0
    2018-03-21 釋出
    JIT 編譯器、局部變量類型引用、資料類型共享、并行GC、root 證書、javah工具、堆配置設定

JDK 11.0
    2018-09-25 釋出
    單指令運作Java檔案、Lambda 參數局部變量文法、基于嵌套通路控制、動态類檔案常量、誤操作垃圾回收器、删除Java EE和 CORBA 子產品、ChaCha20與Poly1305加密算法、Aarch64增強、ZGC試用、棄用 Nashorn JS引擎

JDK 12.0
    2019-03-19 釋出
    JVM 增強、Switch 表達式、檔案 mismatch() 方法、String 新方法 indent()/transform()/describeConstable()/resolveConstantDesc()、JVM常量API、instanceof 模式比對

JDK 13.0
    2019-09-17 釋出
    支援編寫文本塊、Switch 表達式增強、重構遺留的 Socket API、取消送出未使用記憶體、動态CDS存檔、支援Unicode 12.1、DOM 和 SAX 工廠支援命名空間

JDK 14.0
    2020-03-17 釋出
    空指針異常增強提示、Switch 表達式(标準)、instanceof 模式比對(預覽)、Records 類(預覽)、文本塊(第二次預覽)、打包工具(孵化)、JFR 事件流、ZGC ( 支援 macOS 和 Windows )、外部存儲器通路API(孵化)

JDK 15.0
    2020-09-15 釋出
    密封類(預覽)、instanceof 模式比對(第二次預覽)、Records 類(第二次預覽)、文本塊(标準)、隐藏類、删除 Nashorn JS引擎、重構遺留的 DatagramSocket API、外部存儲器通路API(第二次孵化)、棄用RMI激活、移除 Solaris 和 SPARC 的端口

JDK 16.0
    2020-12-10 第一次提案當機
    2021-01-14 第二次提案當機
    2021-02-04 釋出第一個預覽版本
    2021-02-18 釋出第二個預覽版本
    2021-03-16 正式釋出      

在這裡插入圖檔描述

截至2020年12月1日,JDK 16 有 15項 正式提案,另外基于值的類警告和密封類(第二次預覽)2項 仍處于 “針對目标提案” 階段。

Java 16 的新特性包括:

1、基于值的類警告提議 将原始包裝類指定為基于值的類,同時不推薦通過提示新棄用警告促使使用者将其構造函數移除。在 Java 平台中對于任何基于值的類執行個體進行同步的錯誤嘗試,會予以警告。推動這一努力的是 Valhalla 項目,該項目正在以原始類的形式對 Java 程式設計模型進行重大改進。原始類将執行個體聲明為無身份的,并且可以内聯或展平表示形式,其中執行個體可以在記憶體位置之間自由複制,并可以使用執行個體字段的值進行編碼。Java 中原始類的設計和實作現在已經足夠成熟,可以預見,在将來的發行版中會把 Java 平台的某些類遷移至原始類。這些計劃遷移的類在API規範中将被設計成 基于值的類。

2、之前在 JDK 15 中進行過預覽,密封類 和接口限制了可以擴充或實作它們的類和接口。這項計劃的目标包括:允許類或接口的建立者控制負責實作它的代碼,提供比通路修飾符更聲明性的方式來限制超類的使用,并通過提供模式分析基礎來支援模式比對的未來發展。

3、預設情況下,JDK 内部結構是強封裝的,而關鍵内部API(例如misc.Unsafe)除外。自 JDK 9 以來預設允許使用者選擇使用寬松的強封裝。作為 Jigsaw 項目 的一部分,此提案的目标包括提高 JDK 的安全性和可維護性,并鼓勵開發人員從直接使用内部元素逐漸遷移為使用标準 API,這樣開發人員和最終使用者都可以輕松地更新到 Java 的未來版本。該建議确實存在主要風險,即現有版本的 Java 代碼将無法運作。鼓勵開發人員使用 jdeps 工具來識别代碼中依賴的 JDK 内部元素,并在可用時切換到 标準替代版本。開發人員可以使用現有的發行版(如JDK 11)來測試現有代碼,通過使用 --illegal-access=warn 來識别通過反射通路的内部元素,使用 --illegal-access=debug 來定位錯誤的代碼,并使用 --illegal-access=deny 來進行測試。

4、支援靜态類型的純 Java 方式通路本地代碼的 外部連結程式 API。該接口在 JDK 16 中處于孵化階段,與被提案的外部存儲通路接口一起,外部連結程式接口将會大大減少像其他方式綁定本地庫容易出錯的情況。這項計劃目的在于通過用更進階的純 Java 開發模式來替換 JNI(Java本機接口),以提供與C語言的互動,并随着時間的推移,它将更加靈活并适配支援其它平台(例如32位的x86架構)和其他非C語言編寫的外部函數(例如C++編寫的外部函數)。它的性能将會比JNI更加優越。

5、将 ZGC(可擴充的低延遲垃圾收集器)線程堆棧處理 從安全點移至并發階段。該計劃的目标包括從ZGC安全點中删除線程堆棧處理,使堆棧處理變得懶性、協同、并發和增量,從ZGC安全點移除所有其它單一線程的 root 處理,并為其它虛拟機子系統提供了一種延遲處理堆棧的機制。ZGC旨在使 HotSpot 中的GC暫停和可伸縮性問題成為過去。到目前為止,随着堆大小和元空間大小變化而伸縮的GC操作已經從安全點操作中移除,并遷到并發階段,它們包括标記,重定位,引用處理,類解除安裝和大多 root 處理。GC安全點中唯一仍保留執行的是子集root處理和限時标記終止操作。這些 root 處理包括Java線程堆棧和其它線程 root,由于它們會随線程數量而伸縮是以會存在問題。要消除這些問題,每個線程的處理(包括堆棧掃描)必須移動到并發階段。通過這項計劃,提升延遲的吞吐成本将會微不足道,并且在典型計算機上ZGC安全點内部花銷的時間将會少于1毫秒。

6、彈性元空間功能 可将未使用的 HotSpot 虛拟機類中繼資料(元空間)占用的記憶體更迅速地傳回給作業系統,進而減少元空間占用并簡化元空間代碼以降低維護成本。元空間存在大量的堆外記憶體使用問題。該項計劃呼籲采用記憶體分區配置設定方案來替換現有的記憶體配置設定機制,提供一種将記憶體劃分為多個分區以滿足記憶體請求的算法。這種方法已在許多地方使用(例如 Linux 核心等),它将使得在較小塊中配置設定記憶體以減少類加載器開銷的方式變得可行,碎片化也将減少。此外,從作業系統到記憶體管理區域,記憶記憶體都将被延遲、按需使用,以減少加載程式占用的空間,這些加載程式從大型區域開始占用,但又不立即使用它們或可能無法充分利用它們。為了充分利用分區配置設定所提供的彈性,将元空間記憶體排列成大小一緻的顆粒,這些顆粒可以彼此獨立地進行送出和不送出。

7、啟用C++ 14語言功能,以允許在 JDK C++源代碼中使用 C++ 14 功能,并提供關于這些允許在 HotSpot 虛拟機代碼中使用的功能的具體指南。通過JDK 15,我們知道在 JDK 中 C++代碼使用的語言特性已限于 C++ 98/03語言标準。自 JDK 11,源代碼就已更新為支援使用更新版本的C++标準進行建構。這包括能夠使用支援 C++ 11/14語言功能的最新版本的編譯器進行建構。這項提案不推薦對在 HotSpot 之外使用的C++代碼樣式或用法進行更改,但是要利用C++語言的特性,一些建構時的更改是必須的,這取決于平台編譯器。

8、孵化階段的矢量API,是 JDK 中配備的一個孵化子產品jdk.incubator.vector,用于表達矢量計算————編譯為所支援的 CPU 架構上的最佳硬體指令。以實作優于同等标量計算的性能。矢量API提供了一種使用Java編寫複雜矢量算法的機制,該機制使用 HotSpot 虛拟機中預先存在的支援連同一套使用者模型進行矢量化,使其更可預測且更具健壯性。該提案的目标包括提供一個清晰簡潔的API來表達一系列向量計算,通過支援多個 CPU 架構實作平台無關性,以及在 x64 和 AArch64 架構上提供可靠的運作時編譯和性能。優雅降級也是一個目标,在這個目标中,如果向量計算在運作時不能完全表示為硬體向量指令序列,那麼向量計算将優雅地降級,并且仍然可以正常工作,原因可能是某個架構不支援某些指令,或者是其它CPU架構不受支援。

9、将JDK移植到 Windows/AArch64 平台。随着新的伺服器級和消費類 AArch64(ARM64)硬體的釋出,加上需求原因 Windows/AArch64 已經成為一個重要的平台。雖然移植本身已經基本完成,但該項提案的重點是将端口內建到主線JDK庫中。

10、在 x64 和 AArch64 架構上,将 JDK移植到 Alpine Linux 和其他使用 musl 作為其主要C庫的 Linux 發行版。Musl是 ISOC 和 Posix 标準中描述的标準庫功能的Linux實作。 Alpine Linux 由于鏡像較小而被廣泛應用于雲部署、微服務和容器環境中。Linux 版本的 Docker 容器鏡像小于6MB。讓 Java 在這種設定中開箱即用,并允許Tomcat、Jetty、Spring和其它流行的架構在本機環境中正常工作。通過使用 jlink 來減少 Java 運作時的大小,使用者可以建立一個更小的鏡像,以運作特定的應用程式。

11、[提供記錄類,作為不可變資料的透明載體。記錄類可以認為是名義元組。記錄類在 JDK 14 和 JDK 15 中進行了預覽。此做法是為了回應有關Java過于冗長拘謹的抱怨。該計劃的目标包括設計一個表示簡單值集合的面向對象的構造器,幫助開發人員專注于對不可變資料的模組化而不是擴充行為,自動實作資料驅動的方法(例如 equals 和 accessors ),并保留長期的 Java 原則,例如名義類型。

12、Unix-Domain 套接字通道 的添加,其中Unix-Domain(AF_UNIX)套接字支援被添加到 nio.channels 包中的套接字通道和伺服器套接字通道API中。該計劃還擴充了繼承的通道機制,以支援Unix-Domain套接字通道和伺服器套接字通道。Unix-Domain套接字用于同一主機上的程序間通信。它們在大多數方面與TCP/IP套接字類似,除了它們是通過檔案系統路徑名而不是IP位址和端口号尋址的。新功能的目标主要是支援Unix平台和Windows通用的Unix-Domain套接字通道的所有功能。Unix-Domain套接字通道在讀取/寫入行為,連接配接設定,伺服器對傳入連接配接的接受以及在選擇器中與其他非阻塞可選通道的複用方面将與現有的TCP/IP通道相同。Unix-Domain套接字比用于本地,程序間通信的TCP/IP回送連接配接更安全,更高效。

13、外部存儲器通路API,允許Java程式安全地通路Java堆以外的外部存儲器。外部存儲器通路API,以前在JDK 14和JDK 15中都進行過孵化,未來在 JDK 16 中将再次孵化,并加以改良。改良範圍包括在 MemorySegment 和 MemoryAddresses 接口之間劃分更明确的角色。此項提案的目标包括提供一個可以在各種外部存儲(包括本機,持久化媒體以及托管堆存儲器)上運作的 API。該 API 不會對虛拟機的安全性造成威脅。該項提案的動機是為了讓很多 Java程式通路外部存儲,像 Ignite、Memcached 以及 MapDB 。遺憾的是 Java API 還沒有令人滿意的通路外部存儲的解決方案。

14、在 JDK 14和 JDK 15中都已預覽過 instanceof 操作符的 模式比對,它将在JDK 16中最終确定。模式比對使程式中的通用邏輯(即從對象中有條件地提取元件)得以更簡潔、安全的表達。

15、提供一款名為 jpackage 的工具,用于獨立打包 Java 應用程式。jpackage 在 JDK 14 中被作為孵化工具引入,并在 JDK 15 中仍處于孵化階段。到了JDK 16,jpackage 将投入生産,支援本地的軟體包格式,進而為使用者提供自然的安裝體驗,并允許在打包時指定啟動時參數。支援的格式包括 Windows 上的 msi 和 exe ,MacOS 上的 pkg 和 dmg 以及 Linux 上的 deb 和 rpm 。該工具可以直接從指令行或以程式設計方式調用。新的打包工具解決了這樣一種情況:許多Java應用程式需要以全局可用的方式安裝在本機平台上,而不是簡單地放置在類路徑或子產品路徑上。是以提供适合本機平台的可安裝軟體包非常有必要。

16、OpenJDK 源代碼倉庫從 Mercurial 遷移至 Git。推動這一努力會在幾方面展現優勢:版本控制系統中繼資料大小方面、可用工具方面以及托管方面。

17、遷移到 GitHub,這個變化是基于 OpenJDK 源代碼庫從 Mercurial 遷移到 Git,JDK 16源代碼倉庫将出現在流行的代碼共享網站上。Mercurial JDK 和 JDK-sandbox 遷移到 Git、GitHub 和 Skara 的過渡工作已于9月5日完成,現已向使用者開放。

在網站 jdk.java.net 中可以下載下傳到适用于 Linux、Windows 和 MacOS 的 JDK 16 早期測試版本。和JDK 15一樣,JDK 16也會是一個短期版本,僅支援六個月。而計劃在2021年9月釋出的 JDK 17 将會是一個長期支援(LTS)版本,并獲得數年的支援。目前的長期支援(LTS)版本是2018年9月釋出的 JDK 11。      

總結

相信很多企業或個人,目前都還在使用 JDK 8 這個長期維護版本,最新一個長期維護版本是 JDK 11 ,估計使用的人群也還不是特别多,因為對于企業/個人來說,版本更新的成本太大了,往往我們更加需要的是系統能夠穩定安全運作,哪怕是需要犧牲一部分性能。從 JDK8 開始,Java 語言就越顯得更加具有攻擊性和包容性,版本更新速度和周期也是極其驚人,如今短短幾年,已是 JDK 16,是以本人特别看好 Java 在未來市場的占比和技術能力的持續延伸,加油,Java 們。

References

[1] JDK 16: https://www.infoworld.com/art…

[2] JDK 15: https://www.infoworld.com/art…

[3] 基于值的類警告提議: https://openjdk.java.net/jeps…

[4] Valhalla 項目: https://openjdk.java.net/proj…

[5] 基于值的類: https://docs.oracle.com/en/ja…

[6] 密封類: https://openjdk.java.net/jeps…

[7] JDK 内部結構是強封裝的: https://openjdk.java.net/jeps…

[8] Jigsaw 項目: https://openjdk.java.net/proj…

[9] 标準替代版本: https://wiki.openjdk.java.net…'sinternalAPIs

[10] 外部連結程式 API: https://openjdk.java.net/jeps…

[11] ZGC(可擴充的低延遲垃圾收集器)線程堆棧處理: https://openjdk.java.net/jeps…

[12] 彈性元空間功能: https://openjdk.java.net/jeps…

[13] 啟用C++ 14語言功能: https://openjdk.java.net/jeps…

[14] C++ 14: https://www.infoworld.com/art…

[15] 孵化階段的矢量API: https://openjdk.java.net/jeps…

[16] 将JDK移植到 Windows/AArch64 平台: https://openjdk.java.net/jeps…

[17] JDK移植到 Alpine Linux : https://openjdk.java.net/jeps…

[18] jlink: https://openjdk.java.net/jeps…

[19] 提供記錄類: https://openjdk.java.net/jeps…

[20] Unix-Domain 套接字通道: https://openjdk.java.net/jeps…

[21] 外部存儲器通路API: https://openjdk.java.net/jeps…

[22] 模式比對: https://openjdk.java.net/jeps…

[23] 提供一款名為 jpackage 的工具,用于獨立打包 Java 應用程式: https://openjdk.java.net/jeps…

[24] JDK 14: https://www.infoworld.com/art…

[25] OpenJDK 源代碼倉庫從 Mercurial 遷移至 Git: https://openjdk.java.net/jeps…

[26] 遷移到 GitHub: https://openjdk.java.net/jeps…

[27] JDK 16源代碼倉庫将出現在流行的代碼共享網站上: https://www.infoworld.com/art…

[28] jdk.java.net: https://jdk.java.net/16/

繼續閱讀