什么?jdk都到21了,8-17都升級(jí)了啥?
jdk都到21了,8-17都升級(jí)了啥?
今年jdk已經(jīng)發(fā)布了21版本,我的技術(shù)體系還停留在8,不由得開(kāi)始焦慮。本文我們盤(pán)點(diǎn)一下從jdk8到j(luò)dk17都更新了哪些技術(shù)點(diǎn)。
為什么是jdk17呢?因?yàn)閖dk17是一個(gè)LTS版本,至少到2029年,它都會(huì)是jdk8的優(yōu)秀替代品。
?JDK 17 最多可以支持到 2029 年 9 月份。按照技術(shù)更新迭代的速度,這次免費(fèi)商用 8 年可謂是良苦用心,為的就是讓使用者放心大膽地將 JDK 升級(jí)到 JDK 17.
話不多說(shuō),開(kāi)始我們的盤(pán)點(diǎn)。
jdk9(2017年9月)
-
模塊化 -
提供了List.of()、Set.of()、Map.of()和Map.ofEntries()等工廠方法 -
接口支持私有方法 -
Optional類(lèi)改進(jìn) -
多版本兼容Jar包 -
JShell工具 -
try-with-resources的改進(jìn) -
Stream API的改進(jìn) -
設(shè)置G1為JVM默認(rèn)垃圾收集器 -
支持http2.0和websocket的API
重要特性:主要是API的優(yōu)化,如支持HTTP2的Client API、JVM采用G1為默認(rèn)垃圾收集器。
JDK10(2018年3月)
-
局部變量類(lèi)型推斷,類(lèi)似JS可以通過(guò)var來(lái)修飾局部變量,編譯之后會(huì)推斷出值的真實(shí)類(lèi)型 -
不可變集合的改進(jìn) -
并行全垃圾回收器 G1,來(lái)優(yōu)化G1的延遲 -
線程本地握手,允許在不執(zhí)行全局VM安全點(diǎn)的情況下執(zhí)行線程回調(diào),可以停止單個(gè)線程,而不需要停止所有線程或不停止線程 -
Optional新增orElseThrow() -
方法類(lèi)數(shù)據(jù)共享 -
Unicode 語(yǔ)言標(biāo)簽擴(kuò)展 -
根證書(shū)
重要特性:通過(guò)var關(guān)鍵字實(shí)現(xiàn)局部變量類(lèi)型推斷,使Java語(yǔ)言變成弱類(lèi)型語(yǔ)言、JVM的G1垃圾回收由單線程改成多線程并行處理,降低G1的停頓時(shí)間。
JDK11(LTS版本)
-
增加一些字符串處理方法 -
用于 Lambda 參數(shù)的局部變量語(yǔ)法 -
Http Client重寫(xiě),支持HTTP/1.1和HTTP/2 ,也支持 websockets可運(yùn)行單一Java源碼文件,如:java Test.java -
ZGC:可伸縮低延遲垃圾收集器,ZGC可以看做是G1之上更細(xì)粒度的內(nèi)存管理策略。由于內(nèi)存的不斷分配回收會(huì)產(chǎn)生大量的內(nèi)存碎片空間,因此需要整理策略防止內(nèi)存空間碎片化,在整理期間需要將對(duì)于內(nèi)存引用的線程邏輯暫停,這個(gè)過(guò)程被稱為"Stop the world"。只有當(dāng)整理完成后,線程邏輯才可以繼續(xù)運(yùn)行。(并行回收) -
支持 TLS 1.3 協(xié)議 -
Flight Recorder(飛行記錄器),基于OS、JVM和JDK的事件產(chǎn)生的數(shù)據(jù)收集框架 -
對(duì)Stream、Optional、集合API進(jìn)行增強(qiáng)
重要特性:對(duì)于JDK9和JDK10的完善,主要是對(duì)于Stream、集合等API的增強(qiáng)、新增ZGC垃圾收集器。
JDK12(2019年3月)
-
Switch 表達(dá)式擴(kuò)展,可以有返回值 -
新增NumberFormat對(duì)復(fù)雜數(shù)字的格式化 -
字符串支持transform、indent操作 -
新增方法Files.mismatch(Path, Path) -
Teeing Collector -
支持unicode 11 -
Shenandoah GC,新增的GC算法 -
G1收集器的優(yōu)化,將GC的垃圾分為強(qiáng)制部分和可選部分,強(qiáng)制部分會(huì)被回收,可選部分可能不會(huì)被回收,提高GC的效率
重要特性:switch表達(dá)式語(yǔ)法擴(kuò)展、G1收集器優(yōu)化、新增Shenandoah GC垃圾回收算法。
JDK13(2019年9月)
-
Switch 表達(dá)式擴(kuò)展,switch表達(dá)式增加yield關(guān)鍵字用于返回結(jié)果,作用類(lèi)似于return,如果沒(méi)有返回結(jié)果則使用break -
文本塊升級(jí) """ ,引入了文本塊,可以使用"""三個(gè)雙引號(hào)表示文本塊,文本塊內(nèi)部就不需要使用換行的轉(zhuǎn)義字符 -
SocketAPI 重構(gòu),Socket的底層實(shí)現(xiàn)優(yōu)化,引入了NIO -
FileSystems.newFileSystem新方法 -
ZGC優(yōu)化,增強(qiáng) ZGC 釋放未使用內(nèi)存,將標(biāo)記長(zhǎng)時(shí)間空閑的堆內(nèi)存空間返還給操作系統(tǒng),保證堆大小不會(huì)小于配置的最小堆內(nèi)存大小,如果堆最大和最小內(nèi)存大小設(shè)置一樣,則不會(huì)釋放內(nèi)存還給操作系統(tǒng)
重要特性:ZGC優(yōu)化,釋放內(nèi)存還給操作系統(tǒng)、socket底層實(shí)現(xiàn)引入NIO。
JDK14(2020年3月)
-
instanceof模式匹配,instanceof類(lèi)型匹配語(yǔ)法簡(jiǎn)化,可以直接給對(duì)象賦值,如if(obj instanceof String str),如果obj是字符串類(lèi)型則直接賦值給了str變量 -
引入Record類(lèi)型,類(lèi)似于Lombok 的@Data注解,可以向Lombok一樣自動(dòng)生成構(gòu)造器、equals、getter等方法; -
Switch 表達(dá)式-標(biāo)準(zhǔn)化 -
改進(jìn) NullPointerExceptions提示信息,打印具體哪個(gè)方法拋的空指針異常,避免同一行代碼多個(gè)函數(shù)調(diào)用時(shí)無(wú)法判斷具體是哪個(gè)函數(shù)拋異常的困擾,方便異常排查; -
刪除 CMS 垃圾回收器
重要特性:引入了Pattern Matching for instanceof、Records等重要特性。完全移除了CMS回收器。
JDK15(2020年9月)
-
EdDSA 數(shù)字簽名算法 -
Sealed Classes(封閉類(lèi),預(yù)覽),通過(guò)sealed關(guān)鍵字修飾抽象類(lèi)限定只允許指定的子類(lèi)才可以實(shí)現(xiàn)或繼承抽象類(lèi),避免抽象類(lèi)被濫用 -
Hidden Classes(隱藏類(lèi)) -
移除 Nashorn JavaScript引擎 -
改進(jìn)java.net.DatagramSocket 和 java.net.MulticastSocket底層實(shí)現(xiàn)
重要特性:引入了Sealed類(lèi)、隱藏類(lèi)、并行垃圾收集等重要特性。
JDK16(2021年3月)
-
允許在 JDK C ++源代碼中使用 C ++ 14功能 -
ZGC性能優(yōu)化,去掉ZGC線程堆棧處理從安全點(diǎn)到并發(fā)階段 -
增加 Unix 域套接字通道 -
彈性元空間能力 -
提供用于打包獨(dú)立 Java 應(yīng)用程序的 jpackage 工具
重要特性:引入了記錄類(lèi)、垃圾回收器接口、Unix域套接字通道等重要特性。
?JDK16相當(dāng)于是將JDK14、JDK15的一些特性進(jìn)行了正式引入,如instanceof模式匹配(Pattern matching)、record的引入等最終到JDK16變成了final版本。
JDK17(2021年9月)(LTS版本)
-
Free Java License -
JDK 17 將取代 JDK 11 成為下一個(gè)長(zhǎng)期支持版本 -
Spring 6 和 Spring Boot 3需要JDK17 -
移除實(shí)驗(yàn)性的 AOT 和 JIT 編譯器 -
恢復(fù)始終執(zhí)行嚴(yán)格模式 (Always-Strict) 的浮點(diǎn)定義 -
正式引入密封類(lèi)sealed class,限制抽象類(lèi)的實(shí)現(xiàn) -
統(tǒng)一日志異步刷新,先將日志寫(xiě)入緩存,然后再異步刷新
重要特性:雖然JDK17也是一個(gè)LTS版本,但是并沒(méi)有像JDK8和JDK11一樣引入比較突出的特性,主要是對(duì)前幾個(gè)版本的整合和完善。
一點(diǎn)感想
學(xué)技術(shù)時(shí)間長(zhǎng)了難免就麻木了,歸根到底還是因?yàn)闆](méi)有面對(duì)復(fù)雜、棘手的問(wèn)題,倒逼你更新只是體系。
生產(chǎn)中,能用就會(huì)湊乎用,實(shí)在沒(méi)辦法才會(huì)升級(jí),深有體會(huì)。
每次技術(shù)的革新都是業(yè)務(wù)倒逼的,當(dāng)然也會(huì)去主動(dòng)看一些技術(shù),但是沒(méi)有落地的技術(shù)就是虛的。
我們最近在做jdk版本升級(jí),這些點(diǎn)可能是值得考慮升級(jí)的出發(fā)點(diǎn):
-
更好的并發(fā)性能:JDK 17引入了Project Loom,它引入了一種輕量級(jí)的并發(fā)模型,稱為協(xié)程。協(xié)程能夠提供更高效的并發(fā)處理能力,允許應(yīng)用程序創(chuàng)建更多的并發(fā)任務(wù)而不會(huì)消耗過(guò)多的系統(tǒng)資源。這將帶來(lái)更好的性能和吞吐量,特別是在處理高并發(fā)任務(wù)時(shí)。
-
更快的應(yīng)用程序啟動(dòng):JDK 17中的Project Loom還可以實(shí)現(xiàn)更快的應(yīng)用程序啟動(dòng)速度。傳統(tǒng)的線程模型需要更多的時(shí)間和資源來(lái)啟動(dòng)新線程,而協(xié)程的啟動(dòng)速度幾乎可以立即完成。這意味著應(yīng)用程序可以更快地響應(yīng)用戶請(qǐng)求,提供更好的用戶體驗(yàn)。
-
更少的上下文切換開(kāi)銷(xiāo):在傳統(tǒng)的線程模型中,線程之間的切換需要操作系統(tǒng)的干預(yù),涉及到保存和恢復(fù)線程的上下文信息,這會(huì)產(chǎn)生一定的開(kāi)銷(xiāo)。而協(xié)程之間的切換不需要操作系統(tǒng)的干預(yù),因此上下文切換的成本非常低。這將減少不必要的開(kāi)銷(xiāo),提高應(yīng)用程序的性能和響應(yīng)速度。
-
更簡(jiǎn)單的編程模型:協(xié)程提供了更直觀且易于編寫(xiě)和維護(hù)的代碼模型。開(kāi)發(fā)者可以使用同步的方式編寫(xiě)并發(fā)代碼,而不需要顯式地處理線程和鎖。這將減少開(kāi)發(fā)人員的工作量,降低編寫(xiě)并發(fā)代碼的復(fù)雜性,并減少出錯(cuò)的可能性。
JDK的升級(jí)是業(yè)務(wù)發(fā)展的必然趨勢(shì)。相當(dāng)數(shù)量的開(kāi)發(fā)者覺(jué)得覺(jué)得升級(jí)是一種負(fù)擔(dān),會(huì)造成額外工作,出了問(wèn)題費(fèi)力不討好,要是出了安全問(wèn)題更是麻煩。
但是話說(shuō)回來(lái),從企業(yè)角度說(shuō)節(jié)省成本很重要,商業(yè)版jdk收費(fèi)很高,jdk17是目前免費(fèi)且穩(wěn)定性很好的一個(gè)版本。
技術(shù)上,Spring也不再維護(hù)過(guò)去的版本,想要用新特性,就不得不換版本。更新技術(shù),必然會(huì)助推JDK的升級(jí)。當(dāng)越來(lái)越多的公司都更新到JDK17,更多的框架新版本都會(huì)最低支持JDK17,因?yàn)榧嫒菖fJDK成本實(shí)在太高,當(dāng)框架、論壇都是討論JDK17的技術(shù)和各種解決問(wèn)題的方法時(shí),必然會(huì)反推企業(yè)進(jìn)行升級(jí)。
對(duì)我們個(gè)人而言,不斷更新技術(shù)體系,讓自己不被淘汰,基本是正確的選擇。
PS: 大概率在jdk21版本,Project loom會(huì)正式推出,并且已知JDK21又是一個(gè)長(zhǎng)期支持版本 (LTS) ,值得期待。
loom(協(xié)程)一旦release,各種servlet容器,框架如jetty,netty,vert.x等,在它們最新版本基本都會(huì)支持loom,或者叫做虛擬線程的支持, 可以預(yù)見(jiàn)一旦JDK21發(fā)行,很多軟件都會(huì)迎來(lái)一波大迭代更新。
為了當(dāng)loom來(lái)臨的時(shí)刻,各種框架版本井噴的時(shí)候不被淘汰,JDK17趕緊學(xué)起來(lái),用起來(lái)吧。
