自JDK 8 以來所有Java和JVM新功能的分類列表

banq發表於2019-02-23

一個方便的參考,涵蓋從從Java 8到11及更高版本各種新語言功能到新版本命名方案的所有內容。
自從版本8釋出到版本11以來,Java由120個 JDK增強建議(JEP)構成,每個建議都為平臺帶來了一些改進。我決定閱讀它們並根據改進建立一個簡明的分類列表。
因為每個類別中都有許多功能,所以我決定不按時間順序顯示它們,而是從那些看起來最重要的功能開始。此外,我在每個類別的末尾新增了預期的JDK 12功能。

新語言功能
當Java 8引入lambdas時,這是一個非常巨大的變化。雖然最近的版本沒有新增這樣有影響力的功能,但是對該語言進行了許多小的改進。

1. JDK 10,JDK 11引入var使區域性變數宣告不那麼隆重的

var greeting = "Hello World!";


2. JDK 9(專案Jigsaw)加入和向後相容的模組系統,以避免ClassDefNotFoundErrors在執行時建立內部API 

module hu.advancedweb.helloworld {
    requires hu.advancedweb.somedependency;
    exports hu.advancedweb.hello
}


3. JDK 9 介面中增加私有方法(Milling Project Coin)

4. JDK 9 加入匿名內部類的Diamond 運算子

5. JDK 9 加入Try-with-resources允許有效的最終final變數

6. JDK 9 加入@SafeVargs私有例項方法

7. JDK 9 import語句沒有了deprecation警告

8. JDK12: Switch Expressions(預覽版)

JEP 325

int numLetters = switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> 6;
    case TUESDAY                -> 7;
    case THURSDAY, SATURDAY     -> 8;
    case WEDNESDAY              -> 9;
};


新的API
讓我們繼續Java標準庫,重點關注我們可以在日常編碼中使用的新功能。
如果您對Java 8和11之間的所有API級別差異感到好奇,請檢查版本8和11之間的 Java API差異

一般

  • 便利工廠收集方法,以減輕沒有收集文字的痛苦JDK 9

    Set<Integer> mySet = Set.of(1, 2, 3);
    List<Integer> myList = List.of(1, 2, 3);
    Map<String, Integer> myMap = Map.of("one", 1, "two", 2);
    
  • 標準HTTP客戶端,具有HTTP / 2,WebSocket支援和非阻塞API JDK 9(孵化器),JDK 11(標準)

    HttpClient httpClient = HttpClient.newBuilder().build();
    
    HttpRequest request = HttpRequest.newBuilder()
              .uri(URI.create("https://advancedweb.hu/"))
              .GET()
              .build();
    
    HttpResponse<String> response = httpClient.send(request, BodyHandlers.ofString());
    
  • Reactive Streams釋出 - 訂閱框架,用於使用非阻塞背壓JDK 9進行非同步流處理
  • 基於時間的增強CompletableFuture(超時,延遲)JDK 9
  • 字串的改進,如isBlank,lines,repeat和stripJDK 11
  • 更多轉換(dropWhile,takeWhile)和生成(iterate,ofNullable)流的選項; readonly collectors(toUnmodifiableList); 選項可以轉換為流JDK 9
  • Arrays.mismatch:找到兩個陣列JDK 9之間的第一個不匹配元素
  • Stack-Walking API允許懶惰和堆疊幀過濾JDK 9
  • Process API提供更多資訊和控制(例如程式ID,引數,CPU時間,父/子程式),增強ProcessBuilder以幫助建立流程管道JDK 9
  • VarHandleAPI來代替場和陣列相關的操作java.util.concurrent.atomic和sun.misc.Unsafe為了提供低階別的訪問mechamisms,例如原子寫入。JDK 9
  • JDK 9的新組合器和查詢方法MethodHandle
  • 增強的棄用政策。@Deprecated可以標記forRemoval,發出新警告。JDK 9
  • OASIS標準XML目錄API,以安全,高效的方式管理XML中的外部資源JDK 9
  • 將JDK的XML解析器Xerces更新為2.11.0版JDK 9
  • TIFF支援影像I / O框架JDK 9
  • 即將在JDK 12:字串增強功能:align,indent和transformJDK 12
  • 進入JDK 12 :: Files.mismatch在兩個檔案JDK 12的內容中找到第一個不匹配的位元組
  • 進入JDK 12: Collectors.teeing建立一個由兩個下游收集器JDK 12組成的收集器

國際化
  • ResourceBundle以UTF-8而不是ISO-8859-1 JDK 9載入屬性檔案
  • Unicode 10.0,新增大約27.000個字元,10個塊和30個以上的指令碼JDK 9(Unicode 8.0),JDK 11(Unicode 10.0)
  • java.util.Locale和相關的API支援貨幣型別,時區和更多JDK 10
  • 預設JDK 9啟用CLDR區域設定資料

圖形和桌面應用程式
  • 適用於所有平臺的桌面功能,如登入/登出/鎖定事件監聽器和工作列互動JDK 9
  • MultiResolutionImage這使得為​​DPI JDK 9輕鬆檢索特定於解析度的影像
  • Windows和Linux JDK 9上的HiDPI Graphics
  • 在Linux上為JavaFX,Swing和AWT JDK 9啟用GTK 3
  • 使用Swing JDK 9的註釋替換@beaninfoJavadoc標記@BeanInfo
  • 將JavaFX / Media中包含的GStreamer更新為1.4.4版JDK 9
  • 用HarfBuzz JDK 9替換現有的ICU OpenType字型佈局引擎

效能改進
一般

  • 節省空間的緊湊字串,可以更有效地儲存Latin-1字串JDK 9
  • 異形和非分析編譯程式碼的程式碼快取記憶體是分開的,從而提高了JDK 9的效能和記憶體佔用
  • 將Interned Strings儲存在類資料共享存檔中以減少記憶體消耗JDK 9
  • 應用程式類 - 資料共享透過在Java程式之間共享類後設資料來縮短啟動時間並減少佔用空間。JDK 10
  • 進入JDK 12:預設啟用預設類列表的類資料共享存檔,以改善開箱即用的啟動時間JEP 341

庫包相關
  • 改進的內在的java.lang.Math sin,cos並且log功能上AArch64處理器版本的JDK 11
  • 安全管理器效能改進JDK 9
  • Spin-Wait Hint(ThreadonSpinWait)最佳化忙等待樣式迴圈JDK 9
  • 在Java 2D中使用Marlin Renderer作為預設圖形光柵化器而不是Pisces JDK 9
  • 利用最近推出的SPARC和Intel x64 CPU指令JDK 9,改進了GHASH和RSA效能

併發
  • 改進了競爭物件監視器的效能JDK 9
  • 關鍵部分的執行緒堆疊上的額外空間,java.util.concurrent在堆疊溢位的情況下降低鎖中死鎖的風險JDK 9
  • Thread-Local握手停止單個執行緒JDK 10

編譯器
  • javac中的效能改進:型別檢查多重表示式的新策略JDK 9
  • Linux JDK 9(JVM編譯器介面),JDK 9(Graal作為AoT編譯器),JDK 10(Graal作為實驗性JIT編譯器)的實驗性提前編譯功能

垃圾收集器
  • G1垃圾收集器現在是預設值而不是Parallel GC JDK 9
  • G1 GC效能改進:並行完整GC以改善最壞情況延遲JDK 10
  • 介紹Z垃圾收集器,它在大堆JDK 11上提供非常低的暫停時間
  • 介紹Epsilon垃圾收集器,它不實現實際的記憶體回收,爭取儘可能低的開銷JDK 10JDK 11
  • XX:AllocateHeapAt=<path>支援替代記憶體裝置JDK 10
  • 進入JDK 12: G1 GC效能改進:可中斷的混合集合,以滿足使用者提供的暫停目標,在空閒時自動將Java堆記憶體返回給作業系統JEP 344JEP 346
  • 進入JDK 12:介紹Shenandoah垃圾收集器,提供與ZGC類似的好處,但基於不同的演算法JEP 189

診斷和工具
  • Flight Recorder是OpenJDK JDK 11的一部分
  • 透過JMTI JDK 11進行低開銷堆分析
  • C1和C2編譯器的執行時可管理和方法特定控制,支援包含測試JDK 9
  • 針對JVM JDK 9(統一JVM日誌記錄),JDK 9(統一GC日誌記錄)的所有元件的細粒度,易於配置的日誌記錄系統
  • 允許應用程式提供平臺類JDK 9使用的記錄器實現
  • 參加JD​​K 12:基於JMH JEP 230的 Microbenchmark Suite

安全改進
  • 驗證傳入的序列化資料JDK 9
  • 預設金鑰庫型別是標準PKCS12,而不是專有的JKS JDK 9
  • JDK提供了一組預設的根證照頒發機構(CA)證照,因此TLS連線正在開箱即用JDK 10
  • 基於DRBG的SecureRandomJDK 9
  • 使用基於SHA-1的簽名JDK 9禁用X.509證照鏈
  • SHA-3雜湊演算法JDK 9

TLS
  • TLS 1.3支援JDK 11
  • 資料包傳輸層安全性API(DTLS)JDK 9
  • OCSP裝訂TLS以提高證照狀態檢查JDK 9的效能
  • TLS應用層協議協商(ALPN)擴充套件,無需額外往返即可實現協議協商; ALPN是HTTP / 2連線JDK 9的要求

加密
  • 與Curve25519和Curve448 JDK 11的重要協議
  • ChaCha20和Poly1305加密演算法JDK 11


啟動
  • jshell:Java REPL JDK 9(Project Kulla)
  • 啟動單檔案原始碼程式,包括支援#!Unix JDK 11上的shebang()行
  • 編譯老年人平臺版本的--release,其配置--source和--target以及對相應平臺版本連結JDK 9
  • 早期驗證JVM命令列標誌以避免崩潰JDK 9

打包
  • jlinkJava Linker可以為模組化Java應用程式構建最佳化的,纖薄的執行時映像,它只包含JDK JDK 9 的所需部分- [ 1 ],[ 2 ],[ 3 ],[ 4 ],[ 4 ], [ 5 ]
  • 多發行版JAR檔案,允許在單個存檔JDK 9中使用多個特定於Java發行版的類

的Javadoc
  • Javadoc工具現在發出HTML5標記而不是基於框架的佈局,文件包含一個搜尋框以簡化導航JDK 9 - [ 1 ],[ 2 ],[ 3 ]

位元組碼
  • 為靜態字串連線生成的位元組碼使用invokedynamic而不是直接建立StringBuilderappend鏈。這將使字串連線的未來最佳化成為可能,而不需要更改位元組碼。JDK 9
  • INVOKEDYNAMIC可以表示物件屬性和/或集合JDK 9的高階操作
  • CONSTANT_Dynamic常量池條目,使用引導來執行解析度,類似於INVOKEDYNAMIC呼叫JDK 11
  • 引入了包含相同程式碼實體中的類的Nest訪問控制上下文(例如巢狀類),並且無需編譯器將橋接方法插入到生成的位元組碼中。JDK 11
  • 進入JDK 12: java.lang.invoke.constant包,允許輕鬆描述可載入常量(ldc指令的運算元),這比依賴於ad-hoc字串表示JEP 334更不容易出錯。

新平臺
JDK 9為另外三個平臺提供支援:


棄用和刪除
本節總結了Java 8和11之間的重大更改和棄用。

  • 下劃線不再是有效的識別符號(JDK 9
  • var不再是有效的類名(JDK 10
  • 刪除Java EE(JDK 11
  • 刪除CORBA(JDK 11
  • 內部API(sun.*)被刪除或棄用(JDK 9 - [ 1 ],[ 2 ])
  • 刪除apple.applescript和com.apple打包(JDK 9
  • 使用基於SHA-1的簽名禁用X.509證照鏈(JDK 9
  • 刪除啟動時JRE版本選擇指令:JRE-Version清單條目和-version:cli選項(JDK 9
  • 刪除jhat工具(JDK 9
  • 刪除JVM TI hprof代理(JDK 9
  • 刪除JDK 8中不推薦使用的GC組合(JDK 9
  • 刪除javah工具(JDK 10
  • 刪除Threaddestroy和Threadstop
  • 從JRE中刪除Endorsed Standards Override(lib/endorsed)和Extensions(lib/ext)機制。
  • rt.jar從JRE中刪除。
  • ResourceBundle以UTF-8而不是ISO-8859-1(JDK 9)載入屬性檔案
  • 棄用Applet API(JDK 9
  • 棄用Nashorn Javascript引擎(JDK 11
  • 棄用併發標記掃描垃圾收集器(JDK 9
  • 棄用Object.finalize()(JDK 9
  • 棄用Pack200工具和API(JDK 11

如果您對Java 8和11之間的所有API級別差異感到好奇,請檢查 Java Almanac專案。還要檢視 jdeps,Java類依賴性分析器,以確定您的專案是否仍在使用舊的內部API。
新版本計劃
  • 更簡單的版本 - 字串方案,與語義版本控制一致。JDK 9JDK 10

總結

JDK 8於2014年釋出。我們不得不等待JDK 9的三年半。但從那時起事情就加速了。Java有一個新的釋出結構,旨在每六個月釋出一個新版本。JDK 10和 JDK 11已經推出了許多功能。
雖然仍然支援Java 8,但遷移到Java 11會為錶帶來大量改進。

相關文章