Java 16正式發佈,新特性一一解析

{"type":"doc","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"3月16日,甲骨文正式發佈Java 16。甲骨文表示,現在爲所有開發人員和企業提供Java 16。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"據悉,按照甲骨文重要補丁更新(CPU)時間表,甲骨文JDK 16將至少獲得兩次季度更新。隨後,甲骨文JDK 17面世。雖然Java 17將於2021年9月正式發佈,但是jdk.java.net已經提供了它早期的訪問版本。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在轉向六個月的發佈週期後,Java 16是甲骨文發佈的第七個特性版本。甲骨文稱,“在六個月的發佈週期下,可用於生產的創新交付速度已大大提高”。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"Java 16累計修復了1897個問題,其中,有1397個由甲骨文工作人員完成,還有500個由個人開發人員和其他組織機構的開發人員貢獻,包括ARM、SAP、RedHat 和騰訊以及微軟、英特爾、華爲等。而一些小型組織也貢獻了Java 16 中 3%的修復,比如Ampere Computing、Bellsoft、DataDog、Microdoc 和獨立開發人員。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/65\/65c0dc8caeac0b5982d5139996181718.webp","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"甲骨文表示,“再次使用GPLv2和Classpath Exception將Java 16作爲甲骨文OpenJDK版本提供,並且針對使用甲骨文JDK版本作爲甲骨文產品或服務一部分的用戶,或希望能獲得商業支持的用戶提供商業許可”。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"Java 16 的新特性"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"伴隨着數千個性能、穩定性和安全性更新,Java 16 爲用戶提供了十七項主要的增強 \/ 更改(稱爲 JDK 增強提案——JEP),包括三個孵化器模塊和一個預覽特性。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"孵化器模塊(Incubator Module)中引入了一些增強,這是一種將非最終 API 和非最終工具交給開發人員的方法,該方法允許用戶提供反饋,從而改善 Java 平臺的質量。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"同樣,一些增強被作爲 Java SE 平臺的預覽特性、語言或 VM 特性引入,這些增強已完全指定、完全實現但不是永久性的。JDK 特性版本中提供了這些增強,以推動開發人員根據實際使用情況提供反饋,這可能會導致它們在將來的版本中永久保留。這爲用戶提供了及時反饋的機會,並讓工具供應商有機會在大量 Java 開發人員在生產中使用特性之前爲其提供支持。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"Java 16 隨附的 17 個 JEP 分爲六個不同類別:"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"新語言特性"}]},{"type":"heading","attrs":{"align":null,"level":5},"content":[{"type":"text","text":"JEP 394,適用於 instanceof 的模式匹配"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"模式匹配(Pattern Matching)最早在 Java 14 中作爲預覽特性引入,在 Java 15 中還是預覽特性。模式匹配通過對 instacneof 運算符進行模式匹配來增強 Java 編程語言。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"模式匹配使程序中的通用邏輯(即從對象中有條件地提取組件)得以更簡潔、更安全地表示。"}]},{"type":"heading","attrs":{"align":null,"level":5},"content":[{"type":"text","text":"JEP 395,記錄"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"記錄(Records)在 Java 14 和 Java 15 中作爲預覽特性引入。它提供了一種緊湊的語法來聲明類,這些類是淺層不可變數據的透明持有者。這將大大簡化這些類,並提高代碼的可讀性和可維護性。"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"JVM 改進"}]},{"type":"heading","attrs":{"align":null,"level":5},"content":[{"type":"text","text":"JEP 376,ZGC 併發線程處理"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"JEP 376 將 ZGC 線程棧處理從安全點轉移到一個併發階段,甚至在大堆上也允許在毫秒內暫停 GC 安全點。消除 ZGC 垃圾收集器中最後一個延遲源可以極大地提高應用程序的性能和效率。"}]},{"type":"heading","attrs":{"align":null,"level":5},"content":[{"type":"text","text":"JEP 387,彈性元空間"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"此特性可將未使用的 HotSpot 類元數據(即元空間,metaspace)內存更快速地返回到操作系統,從而減少元空間的佔用空間。具有大量類加載和卸載活動的應用程序可能會佔用大量未使用的空間。新方案將元空間內存按較小的塊分配,它將未使用的元空間內存返回給操作系統來提高彈性,從而提高應用程序性能並降低內存佔用。"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"新工具和庫"}]},{"type":"heading","attrs":{"align":null,"level":5},"content":[{"type":"text","text":"JEP 380,Unix-Domain 套接字通道"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"Unix-domain 套接字一直是大多數 Unix 平臺的一個特性,現在在 Windows 10 和 Windows Server 2019 也提供了支持。此特性爲 java.nio.channels 包的套接字通道和服務器套接字通道 API 添加了 Unix-domain(AF_UNIX)套接字支持。它擴展了繼承的通道機制以支持 Unix-domain 套接字通道和服務器套接字通道。Unix-domain 套接字用於同一主機上的進程間通信(IPC)。它們在很大程度上類似於 TCP\/IP,區別在於套接字是通過文件系統路徑名而不是 Internet 協議(IP)地址和端口號尋址的。對於本地進程間通信,Unix-domain 套接字比 TCP\/IP 環回連接更安全、更有效。"}]},{"type":"heading","attrs":{"align":null,"level":5},"content":[{"type":"text","text":"JEP 392,打包工具"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"此特性最初是作爲 Java 14 中的一個孵化器模塊引入的,該工具允許打包自包含的 Java 應用程序。它支持原生打包格式,爲最終用戶提供自然的安裝體驗,這些格式包括 Windows 上的 msi 和 exe、macOS 上的 pkg 和 dmg,還有 Linux 上的 deb 和 rpm。它還允許在打包時指定啓動時參數,並且可以從命令行直接調用,也可以通過 ToolProvider API 以編程方式調用。注意 jpackage 模塊名稱從 jdk.incubator.jpackage 更改爲 jdk.jpackage。這將改善最終用戶在安裝應用程序時的體驗,並簡化了“應用商店”模型的部署。"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"爲未來做好準備"}]},{"type":"heading","attrs":{"align":null,"level":5},"content":[{"type":"text","text":"JEP 390,對基於值的類發出警告"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"此特性將原始包裝器類(java.lang.Integer、java.lang.Double 等)指定爲基於值的(類似於 java.util.Optional 和 java.time.LocalDateTime),並在其構造器中添加 forRemoval(自 JDK 9 開始被棄用),這樣會提示新的警告。在 Java 平臺中嘗試在任何基於值的類的實例上進行不正確的同步時,它會發出警告。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"許多流行的開源項目已經在其源中刪除了包裝構造器調用來響應 Java 9 的棄用警告,並且鑑於“棄用移除”警告的緊迫性,我們可以期望更多開源項目跟上這一步伐。"}]},{"type":"heading","attrs":{"align":null,"level":5},"content":[{"type":"text","text":"JEP 396,默認強封裝 JDK 內部元素"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"此特性會默認強封裝 JDK 的所有內部元素,但關鍵內部 API(例如 sun.misc.Unsafe)除外。默認情況下,使用早期版本成功編譯的訪問 JDK 內部 API 的代碼可能不再起作用。鼓勵開發人員從使用內部元素遷移到使用標準 API 的方法上,以便他們及其用戶都可以無縫升級到將來的 Java 版本。強封裝由 JDK 9 的啓動器選項–illegal-access 控制,到 JDK 15 默認改爲 warning,從 JDK 16 開始默認爲 deny。(目前)仍然可以使用單個命令行選項放寬對所有軟件包的封裝,將來只有使用–add-opens 打開特定的軟件包纔行。"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"孵化器和預覽特性"}]},{"type":"heading","attrs":{"align":null,"level":5},"content":[{"type":"text","text":"JEP 338,向量 API(孵化器)"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"該孵化器 API 提供了一個 API 的初始迭代以表達一些向量計算,這些計算在運行時可靠地編譯爲支持的 CPU 架構上的最佳向量硬件指令,從而獲得優於同等標量計算的性能,充分利用單指令多數據(SIMD)技術(大多數現代 CPU 上都可以使用的一種指令)。儘管 HotSpot 支持自動向量化,但是可轉換的標量操作集有限且易受代碼更改的影響。該 API 將使開發人員能夠輕鬆地用 Java 編寫可移植的高性能向量算法。"}]},{"type":"heading","attrs":{"align":null,"level":5},"content":[{"type":"text","text":"JEP 389,外部鏈接器 API(孵化器)"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"該孵化器 API 提供了靜態類型、純 Java 訪問原生代碼的特性,該 API 將大大簡化綁定原生庫的原本複雜且容易出錯的過程。Java 1.1 就已通過 Java 原生接口(JNI)支持了原生方法調用,但並不好用。Java 開發人員應該能夠爲特定任務綁定特定的原生庫。它還提供了外來函數支持,而無需任何中間的 JNI 粘合代碼。"}]},{"type":"heading","attrs":{"align":null,"level":5},"content":[{"type":"text","text":"JEP 393,外部存儲器訪問 API(第 3 個孵化器)"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在 Java 14 和 Java 15 中作爲孵化器 API 引入的這個 API 使 Java 程序能夠安全有效地對各種外部存儲器(例如本機存儲器、持久性存儲器、託管堆存儲器等)進行操作。它提供了外部鏈接器 API 的基礎。"}]},{"type":"heading","attrs":{"align":null,"level":5},"content":[{"type":"text","text":"JEP 397,密封類(第二預覽)"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這個預覽特性可以限制哪些類或接口可以擴展或實現它們;它允許類或接口的作者控制負責實現它的代碼;它還提供了比訪問修飾符更具聲明性的方式來限制對超類的使用。它還通過對模式進行詳盡的分析來支持模式匹配的未來發展。"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"提升 OpenJDK 開發人員的生產力"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"其餘更改對 Java 開發人員(使用 Java 編寫代碼和運行應用程序的人員)不會直接可見,而只對 Java 開發人員(參與 OpenJDK 開發的人員)可見。"}]},{"type":"heading","attrs":{"align":null,"level":5},"content":[{"type":"text","text":"JEP 347,啓用 C++14 語言特性(在 JDK 源代碼中)"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"它允許在 JDK C++ 源代碼中使用 C++14 語言特性,並提供在 HotSpot 代碼中可以使用哪些特性的具體指導。在 JDK 15 中,JDK 中 C++ 代碼使用的語言特性僅限於 C++98\/03 語言標準。它要求更新各種平臺編譯器的最低可接受版本"}]},{"type":"heading","attrs":{"align":null,"level":5},"content":[{"type":"text","text":"JEP 357,從 Mercurial 遷移到 Git;JEP 369,遷移到 GitHub"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這些 JEP 將 OpenJDK 社區的源代碼存儲庫從 Mercurial(hg)遷移到 Git,並將它們託管在 GitHub 上以供 JDK 11 及更高版本使用,其中包括將 jcheck、webrev 和 defpath 工具等工具更新到 Git。Git 減小了元數據的大小(約 1\/4),可節省本地磁盤空間並減少克隆時間。與 Mercurial 相比,現代工具鏈可以更好地與 Git 集成。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"Open JDK Git 存儲庫現在位於 https:\/\/github.com\/openjdk。"}]},{"type":"heading","attrs":{"align":null,"level":5},"content":[{"type":"text","text":"JEP 386,AlpineLinux 移植;JEP 388,Windows\/AArch64 移植"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這些 JEP 的重點不是移植工作本身,而是將它們集成到 JDK 主線存儲庫中;JEP 386 將 JDK 移植到 Alpine Linux 和其他使用 musl 作爲 x64 上主要 C 庫的發行版上。此外,JEP 388 將 JDK 移植到 Windows AArch64(ARM64)。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"工具鏈支持"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"工具鏈有助於提高開發人員的生產力。目前,對Java 16提供支持的IDE有JetBrainsIDEA、EclipseIDE。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"甲骨文表示,“我們繼續歡迎領先的 IDE 供應商所做的努力,這些供應商的工具鏈解決方案爲開發人員提供了對當前 Java 版本的支持”。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"寫在最後:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"去年,Java迎來25週年。根據IDC 的最新報告“Java Turns 25”顯示,超過 900 萬名開發人員(全球專職開發人員中的 69%)在使用 Java——比其他任何語言都多。憑藉自身不斷提高平臺性能、穩定性和安全性的能力,Java一直是開發人員中最流行的編程語言,被譽爲“宇宙第一語言”。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"甲骨文在博文寫道:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"經過二十多年的持續創新,Java一直在通過適應不斷變化的技術格局來保持靈活性,同時維持平臺獨立性;通過保持向後兼容性來保證可靠性;在不犧牲安全性的前提下加速創新來保持優勢。"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"然而,這並非意味着Java可以“高枕無憂”。關於Java的未來,可以查看《"},{"type":"link","attrs":{"href":"https:\/\/www.infoq.cn\/article\/RQfWw2R2ZpYQiOlc1WBE","title":"","type":null},"content":[{"type":"text","text":"雲原生時代,Java 的危與機"}]},{"type":"text","text":"》。"}]}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章