JDK 15:Java 15中的新功能
標(biāo)準(zhǔn)Java的下一版本將具有文本塊,垃圾收集器,隱藏的類以及模式匹配和記錄的預(yù)覽。
隨著Java 14于3月17日全面上市,將在2020年9月15日推出Java 15的后續(xù)產(chǎn)品。到目前為止,已經(jīng)計(jì)劃對該版本進(jìn)行八次正式更改。 另外兩個(gè)提案-加密簽名和記錄的第二個(gè)預(yù)覽-可能很快就會(huì)成為正式提案。
Java開發(fā)工具包(JDK)15為下一版本的Java SE(標(biāo)準(zhǔn)版)提供了基礎(chǔ)。 在9月全面上市之前,將在6月和7月進(jìn)行縮減階段,然后在8月發(fā)布兩個(gè)候選版本。
OpenJDK 15提案的詳細(xì)信息:
Records, 是充當(dāng)不可變數(shù)據(jù)的透明載體的類,將在JDK 14中作為早期預(yù)覽首次亮相后,將包含在JDK 15的第二個(gè)預(yù)覽版本中。該計(jì)劃的目標(biāo)包括設(shè)計(jì)一個(gè)表示對象的構(gòu)造,以表達(dá) 簡單的值聚合,幫助程序員專注于對不可變數(shù)據(jù)建模而不是擴(kuò)展行為,自動(dòng)實(shí)現(xiàn)數(shù)據(jù)驅(qū)動(dòng)的方法(例如equals和評估者),并保留長期的Java原則,例如標(biāo)稱類型和遷移兼容性。
基于愛德華茲曲線數(shù)字簽名算法(EdDSA)的密碼簽名。 EdDSA是一種現(xiàn)代的橢圓曲線方案,具有優(yōu)于JDK中現(xiàn)有簽名方案的優(yōu)勢。 EdDSA僅在SunEC提供者中實(shí)施。 與其他簽名方案相比,EdDSA具有更高的安全性和性能,因此需求旺盛。 加密庫(例如OpenSSL和BoringSSL)已經(jīng)支持該功能。
通過使用更簡單,更現(xiàn)代的實(shí)現(xiàn)來替換java.net.datagram.Socket和java.net.MulticastSocket API的基礎(chǔ)實(shí)現(xiàn),從而重新實(shí)現(xiàn)傳統(tǒng)的DatagramSocket API,該實(shí)現(xiàn)1.易于調(diào)試和維護(hù),并且2.可與當(dāng)前正在使用的虛擬線程一起使用 在Project Loom中進(jìn)行了探索。 新計(jì)劃是對JDK增強(qiáng)建議353的后續(xù),該建議重新實(shí)現(xiàn)了舊版Socket API。 java.net.datagram.Socket和java.net.MulticastSocket的當(dāng)前實(shí)現(xiàn)可以追溯到JDK 1.0,而IPv6仍在開發(fā)中。 因此,MulticastSocket的當(dāng)前實(shí)現(xiàn)嘗試以難以維護(hù)的方式協(xié)調(diào)IPv4和IPv6。
默認(rèn)情況下禁用偏向鎖定,并棄用所有相關(guān)的命令行選項(xiàng)。 目標(biāo)是確定是否需要繼續(xù)支持代價(jià)昂貴的,具有維護(hù)成本的有偏鎖定的傳統(tǒng)同步優(yōu)化,該優(yōu)化在HotSpot虛擬機(jī)中用于減少無競爭鎖定的開銷。 盡管某些Java應(yīng)用程序可能會(huì)在禁用偏置鎖定的情況下看到性能下降的趨勢,但是偏置鎖定的性能提升通常不如從前那樣明顯。
在JDK 14中的先前預(yù)覽之后,是instanceof的模式匹配的第二次預(yù)覽。模式匹配使程序中的通用邏輯(主要是從對象中有條件地提取組件)得以更簡潔地表達(dá)。 Haskell和C#等語言因其簡潔性和安全性而接受了模式匹配。
隱藏類,即不能被其他類的字節(jié)碼直接使用的類,是供在運(yùn)行時(shí)生成類并通過反射間接使用它們的框架使用的??梢詫㈦[藏類定義為訪問控制嵌套的成員,并且可以獨(dú)立于其他類進(jìn)行卸載。該提案將通過啟用標(biāo)準(zhǔn)API來定義無法發(fā)現(xiàn)且生命周期有限的隱藏類,從而提高JVM上所有語言的效率。 JDK內(nèi)部和外部的框架將能夠動(dòng)態(tài)生成可以代替定義隱藏類的類?;贘VM構(gòu)建的許多語言都依靠動(dòng)態(tài)類生成來提高靈活性和效率。該提案的目標(biāo)包括:允許框架將類定義為框架的不可發(fā)現(xiàn)的實(shí)現(xiàn)細(xì)節(jié),因此它們不能被其他類鏈接,也不能通過反射來發(fā)現(xiàn);支持使用不可發(fā)現(xiàn)的類擴(kuò)展訪問控制嵌套;并支持主動(dòng)卸載不可發(fā)現(xiàn)的類,因此框架可以靈活地定義所需的數(shù)量。另一個(gè)目標(biāo)是棄用非標(biāo)準(zhǔn)API misc.Unsafe::defineAnonymousClass,以棄用將來的發(fā)行版。另外,由于此提議,Java語言也不會(huì)更改。
根據(jù)該提議,Z垃圾收集器(ZGC)將從實(shí)驗(yàn)功能升級為產(chǎn)品。 ZGC已集成到2018年9月發(fā)布的JDK 11中,是一個(gè)可擴(kuò)展的低延遲垃圾回收器。 引入ZGC是一項(xiàng)實(shí)驗(yàn)功能,因?yàn)镴ava的開發(fā)人員決定應(yīng)謹(jǐn)慎且逐步地引入這種規(guī)模和復(fù)雜性的功能。 從那時(shí)起,添加了許多改進(jìn),從并發(fā)類卸載,未使用內(nèi)存的未提交,對數(shù)據(jù)類共享的支持到改進(jìn)的NUMA感知和多線程堆預(yù)觸。 此外,最大堆大小已從4 TB增加到16 TB。 支持的平臺包括Linux,Windows和MacOS。
在JDK 14和JDK 13中都預(yù)覽過的文本塊旨在通過簡化表示跨幾行源代碼的字符串的表達(dá),同時(shí)避免在常見情況下的轉(zhuǎn)義序列,從而簡化了編寫Java程序的任務(wù)。 文本塊是一種多行字符串文字,它避免了大多數(shù)轉(zhuǎn)義序列的需要,以可預(yù)測的方式自動(dòng)設(shè)置字符串格式,并在需要時(shí)為開發(fā)人員提供了對該格式的控制權(quán)。 文本塊建議的目標(biāo)是提高Java程序中字符串的可讀性,這些字符串表示用非Java語言編寫的代碼。 另一個(gè)目標(biāo)是通過規(guī)定任何新構(gòu)造都可以表示與字符串文字相同的字符串集,解釋相同的轉(zhuǎn)義序列并以與字符串文字相同的方式進(jìn)行操作來支持從字符串文字的遷移。 OpenJDK開發(fā)人員希望添加轉(zhuǎn)義序列來管理顯式空白和換行控件。
Shenandoah的低暫停時(shí)間垃圾收集器將成為生產(chǎn)功能并退出實(shí)驗(yàn)階段。 一年前已將其集成到JDK中。
移除Nashorn,該功能于2014年3月在JDK 8中首次亮相,但此后已被諸如GraalVM之類的技術(shù)淘汰。 OpenJDK 15提案要求刪除Nashorn API和用于調(diào)用Nashorn的jjs命令行工具。