能夠舉幾個即可:
Java10 - 并行全垃圾回收器 G1
大家如果接觸過 Java 性能調優工作,應該會知道,調優的最終目標是通過參數設置來達到快速、低延時的內存垃圾回收以提高應用吞吐量,盡可能的避免因內存回收不及時而觸發的完整 GC(Full GC 會帶來應用出現卡頓)。
G1 垃圾回收器是 Java 9 中 Hotspot 的默認垃圾回收器,是以一種低延時的垃圾回收器來設計的,旨在避免進行 Full GC,但是當并發收集無法快速回收內存時,會觸發垃圾回收器回退進行 Full GC。之前 Java 版本中的 G1 垃圾回收器執行 GC 時采用的是基于單線程標記掃描壓縮算法(mark-sweep-compact)。為了最大限度地減少 Full GC 造成的應用停頓的影響,Java 10 中將為 G1 引入多線程并行 GC,同時會使用與年輕代回收和混合回收相同的并行工作線程數量,從而減少了 Full GC 的發生,以帶來更好的性能提升、更大的吞吐量。
Java 10 中將采用并行化 mark-sweep-compact 算法,并使用與年輕代回收和混合回收相同數量的線程。具體并行 GC 線程數量可以通過: -XX:ParallelGCThreads 參數來調節,但這也會影響用于年輕代和混合收集的工作線程數。
Java11 - ZGC:可伸縮低延遲垃圾收集器 ZGC
即 Z Garbage Collector(垃圾收集器或垃圾回收器),這應該是 Java 11 中最為矚目的特性,沒有之一。ZGC 是一個可伸縮的、低延遲的垃圾收集器,主要為了滿足如下目標進行設計:
GC 停頓時間不超過 10ms即能處理幾百 MB 的小堆,也能處理幾個 TB 的大堆應用吞吐能力不會下降超過 15%(與 G1 回收算法相比)方便在此基礎上引入新的 GC 特性和利用 colord針以及 Load barriers 優化奠定基礎當前只支持 Linux/x64 位平臺
停頓時間在 10ms 以下,10ms 其實是一個很保守的數據,即便是 10ms 這個數據,也是 GC 調優幾乎達不到的極值。根據 SPECjbb 2015 的基準測試,128G 的大堆下最大停頓時間才 1.68ms,遠低于 10ms,和 G1 算法相比,改進非常明顯。
Java 14 - Switch 表達式(正式版)
switch 表達式在之前的 Java 12 和 Java 13 中都是處于預覽階段,而在這次更新的 Java 14 中,終于成為穩定版本,能夠正式可用。
switch 表達式帶來的不僅僅是編碼上的簡潔、流暢,也精簡了 switch 語句的使用方式,同時也兼容之前的 switch 語句的使用;之前使用 switch 語句時,在每個分支結束之前,往往都需要加上 break 關鍵字進行分支跳出,以防 switch 語句一直往后執行到整個 switch 語句結束,由此造成一些意想不到的問題。switch 語句一般使用冒號 :來作為語句分支代碼的開始,而 switch 表達式則提供了新的分支切換方式,即 -> 符號右則表達式方法體在執行完分支方法之后,自動結束 switch 分支,同時 -> 右則方法塊中可以是表達式、代碼塊或者是手動拋出的異常。
以往的 switch 語句寫法如下:
而現在 Java 14 可以使用 switch 表達式正式版之后,上面語句可以轉換為下列寫法:
很明顯,switch 表達式將之前 switch 語句從編碼方式上簡化了不少,但是還是需要注意下面幾點:
需要保持與之前 switch 語句同樣的 case 分支情況。 之前需要用變量來接收返回值,而現在直接使用 yield 關鍵字來返回 case 分支需要返回的結果。 現在的 switch 表達式中不再需要顯式地使用 return、break 或者 continue 來跳出當前分支。 現在不需要像之前一樣,在每個分支結束之前加上 break 關鍵字來結束當前分支,如果不加,則會默認往后執行,直到遇到 break 關鍵字或者整個 switch 語句結束,在 Java 14 表達式中,表達式默認執行完之后自動跳出,不會繼續往后執行。 對于多個相同的 case 方法塊,可以將 case 條件并列,而不需要像之前一樣,通過每個 case 后面故意不加 break 關鍵字來使用相同方法塊。
使用 switch 表達式來替換之前的 switch 語句,確實精簡了不少代碼,提高了編碼效率,同時也可以規避一些可能由于不太經意而出現的意想不到的情況,可見 Java 在提高使用者編碼效率、編碼體驗和簡化使用方面一直在不停的努力中,同時也期待未來有更多的類似 lambda、switch 表達式這樣的新特性出來。
Java 14 - Records
在 Java 14 中引入了 Record 類型,其效果有些類似 Lombok 的 @Data 注解、Kotlin 中的 data class,但是又不盡完全相同,它們的共同點都是類的部分或者全部可以直接在類頭中定義、描述,并且這個類只用于存儲數據而已。
對于 Record 類型,具體可以用下面代碼來說明:
對上述代碼進行編譯,然后反編譯之后可以看到如下結果: