日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JDK13的六大重要新特性

發布時間:2024/2/28 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JDK13的六大重要新特性 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • JDK13的六大重要特性
    • 支持Unicode 12.1
    • 動態CDS歸檔(Dynamic CDS Archiving)
    • java.net.Socket和java.net.ServerSocket API的重新實現
    • ZGC的增強
    • 文本塊(預覽語言功能)
    • switch表達式(預覽語言功能)

JDK13的六大重要特性

JDK13在9月17號全球首發了,Oracle JDK 13通過改善Java SE平臺和JDK的性能,穩定性和安全性來提高開發人員的生產力。這次的JDK13包含了5個JEP(Java Enhancement Proposals)和一個Unicode 12.1的支持總共6大主要新特性。下面我們一一詳細說明。

  • 支持Unicode 12.1
  • 動態CDS歸檔(Dynamic CDS Archiving)
  • java.net.Socket和java.net.ServerSocket API的重新實現
  • ZGC的增強
  • 文本塊(預覽語言功能)
  • switch表達式(預覽語言功能)

支持Unicode 12.1

java.lang.Character支持12.1級別的Unicode字符數據庫,其中12.0自11.0起增加了554個字符,總共137,928個字符。 這些增加的內容包括4個新腳本,總共150個腳本,以及61個新表情符號字符。 自12.0起,12.1正好加一個字符,即U+32FF (SQUARE ERA NAME REIWA)。

java.text.Bidi和java.text.Normalizer類分別支持12.0級Unicode標準附件#9和#15。

java.util.regex軟件包支持基于Unicode標準附件#29的12.0級的擴展字素集群

動態CDS歸檔(Dynamic CDS Archiving)

相對于默認CDS存檔,在HotSpot中使用AppCDS歸檔應用程序類可提供額外的啟動時間和內存優勢。但是,當前需要三步過程才能將AppCDS用于Java應用程序:

  • 進行一次或多次試運行以創建class列表
  • 將創建的class列表轉儲存檔
  • 然后和該存檔一起運行
  • 此外,此過程僅適用于僅使用內置類加載器的應用程序。使用用戶自定義的類加載器的應用程序使用起來并不容易,目前在HotSpot中僅僅是實驗性的支持。

    通過命令行選項啟用的動態歸檔將通過消除試運行(上面的步驟1)來簡化AppCDS的使用,并將有效,統一地支持內置類加載器和用戶定義的類加載器。

    此JEP的后續增強功能可以在應用程序的第一次運行期間執行自動存檔生成。這將消除顯式的存檔創建步驟(上面的步驟2)。 從而讓CDS / AppCDS的使用變得完全透明和自動。

    該動態歸檔支持以下類型:

    • 當成功映射兩個存檔時,支持靜態基本存檔(默認CDS存檔)+動態存檔
    • 當無法映射動態存檔時,僅靜態基本存檔

    當前,動態存檔要求將默認CDS存檔用作基本存檔。如果無法在運行時映射和使用基本層歸檔,則將自動禁用頂層動態歸檔。

    怎么使用?

    如果指定了-XX:ArchiveClassesAtExit選項,則當應用程序退出時,將動態創建共享檔案。

    動態生成的存檔是在與運行的JDK映像打包在一起的默認系統存檔的頂部創建的。 將為每個應用程序生成一個單獨的頂層存檔文件。 用戶可以將動態檔案名稱的文件名指定為-XX:ArchiveClassesAtExit選項的參數。 例如,以下命令創建hello.jsa:

    %bin / java -XX:ArchiveClassesAtExit = hello.jsa -cp hello.jar Hello

    要使用此動態存檔運行同一應用程序:
    %bin / java -XX:SharedArchiveFile = hello.jsa -cp hello.jar Hello

    java.net.Socket和java.net.ServerSocket API的重新實現

    java.net.Socket和java.net.ServerSocket API將所有套接字操作委托給java.net.SocketImpl,這是自JDK 1.0起已經存在的服務提供程序接口(SPI)機制。內置的實現稱為“普通”實現,由非公開的PlainSocketImpl通過支持類SocketInputStream和SocketOutputStream實施。

    PlainSocketImpl由其他兩個JDK內部實現擴展,這些實現支持通過SOCKS和HTTP代理服務器的連接。默認情況下,使用基于SOCKS的SocketImpl創建Socket和ServerSocket(有時是延遲的)。在ServerSocket的情況下,使用SOCKS實現是一個古怪的事情,可以追溯到對JDK 1.4中的代理服務器連接的實驗性(并且自從刪除以來)支持。

    新的實現NioSocketImpl替代了PlainSocketImpl。它被開發為易于維護和調試。它與新I / O(NIO)實現共享相同的JDK內部基礎結構,因此不需要自己的本機代碼。它與現有的緩沖區高速緩存機制集成在一起,因此不需要將線程堆棧用于I / O。它使用java.util.concurrent鎖而不是同步方法,以便將來可以在fibers上很好地使用。在JDK 11中,大多數NIO SocketChannel和其他SelectableChannel實現都是在實現相同目標的情況下重新實現的。

    ZGC的增強

    ZGC當前不會uncommit并將內存返回給操作系統,即使該內存已經使用了很長時間也是如此。 對于所有類型的應用程序和環境,尤其是那些關注內存占用的應用程序和環境,此行為都不是最佳的。

    HotSpot中的其他垃圾收集器(例如G1和Shenandoah)如今都提供了此功能,ZGC也將添加這個樣的功能。

    ZGC堆由一組稱為ZPages的堆區域組成。每個ZPage與可變數量的已提交堆內存關聯。當ZGC壓縮堆時,ZPage被釋放并插入到頁面緩存ZPageCache中。頁面緩存中的ZPage已準備好重用以滿足新的堆分配,在這種情況下,它們將從緩存中刪除。頁面緩存對于性能至關重要,因為提交和取消提交內存是昂貴的操作。

    頁面緩存中的ZPages集合表示堆中未使用的部分,這些部分可能尚未提交并返回給操作系統。因此,可以通過簡單地從頁面緩存中清除一組精心選擇的ZPage,然后取消提交與這些頁面關聯的內存來取消提交內存。頁面緩存已經使ZPage保持最近使用(LRU)的順序,并按大小(小,中和大)進行了分隔,因此退出ZPage和取消提交內存的機制相對簡單。挑戰在于設計策略,該策略決定何時該從緩存中逐出ZPage。

    一個簡單的策略是擁有一個超時或延遲值,該值指定ZPage在退出之前可以在頁面緩存中停留多長時間。此超時將具有一些合理的默認值,并帶有命令行選項來覆蓋它。 Shenandoah GC使用這樣的策略,默認值為5分鐘,并使用命令行選項-XX:ShenandoahUncommitDelay = 覆蓋默認策略。

    類似于上述政策的一項政策可能會相當有效。但是,也可以設想更復雜的策略,而不涉及添加新的命令行選項。例如,啟發式算法根據GC頻率或其他一些數據找到合適的超時值。我們最初將使用-XX:ZUncommitDelay = 選項提供一個簡單的超時策略,然后再提供一種更復雜的策略(如果找到)。

    uncommit功能將默認啟用。但是無論策略決定了什么,ZGC都不應uncommit內存,以使堆低于其最小大小(-Xms)。這意味著,如果以最小堆大小(-Xms)等于最大堆大小(-Xmx)啟動JVM,則會有效禁用取消提交功能。也將提供選項-XX:-ZUncommit以顯式禁用此功能。

    最后,Linux / x64上的ZGC使用tmpfs或hugetlbfs文件來備份堆。Uncommitting這些文件使用的內存需要具有FALLOC_FL_PUNCH_HOLE支持的fallocate(2),該支持最早出現在Linux 3.5(tmpfs)和4.3(hugetlbfs)中。在較舊的Linux內核上運行時,ZGC應該繼續像以前一樣工作,但禁用了uncommit功能。

    文本塊(預覽語言功能)

    文本塊是一個預覽語言功能,可能會在后面的版本進行修改或者刪除。

    文本塊是一種多行字符串文字,它避免了大多數轉義序列的需要,以一種可預測的方式自動設置字符串的格式,并在需要時使開發人員可以控制格式。 這是JDK 13中的預覽語言功能。

    HTML example

    傳統方式:

    String html = "<html>\n" +" <body>\n" +" <p>Hello, world</p>\n" +" </body>\n" +"</html>\n";

    文本塊方式:

    String html = """<html><body><p>Hello, world</p></body></html>""";

    SQL example

    傳統方式:

    String query = "SELECT `EMP_ID`, `LAST_NAME` FROM `EMPLOYEE_TB`\n" +"WHERE `CITY` = 'INDIANAPOLIS'\n" +"ORDER BY `EMP_ID`, `LAST_NAME`;\n";

    文本塊方式:

    String query = """SELECT `EMP_ID`, `LAST_NAME` FROM `EMPLOYEE_TB`WHERE `CITY` = 'INDIANAPOLIS'ORDER BY `EMP_ID`, `LAST_NAME`;""";

    switch表達式(預覽語言功能)

    擴展switch使其可以用作語句或表達式,從而使兩種形式都可以使用:
    傳統的case …:labels(需要break)或新case …->labels(不需要break) ,還有另一個新語句,用于從switch表達式產生值。 這些更改將簡化日常編碼。 這是JDK 13中的預覽語言功能。

    原始寫法:

    switch (day) {case MONDAY:case FRIDAY:case SUNDAY:System.out.println(6);break;case TUESDAY:System.out.println(7);break;case THURSDAY:case SATURDAY:System.out.println(8);break;case WEDNESDAY:System.out.println(9);break; }

    最新寫法:

    switch (day) {case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);case TUESDAY -> System.out.println(7);case THURSDAY, SATURDAY -> System.out.println(8);case WEDNESDAY -> System.out.println(9); }

    switch 表達式,用于返回值:

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

    更多精彩內容且看:

    • 區塊鏈從入門到放棄系列教程-涵蓋密碼學,超級賬本,以太坊,Libra,比特幣等持續更新
    • Spring Boot 2.X系列教程:七天從無到有掌握Spring Boot-持續更新
    • Spring 5.X系列教程:滿足你對Spring5的一切想象-持續更新
    • java程序員從小工到專家成神之路(2020版)-持續更新中,附詳細文章教程

    更多教程請參考 flydean的博客

    總結

    以上是生活随笔為你收集整理的JDK13的六大重要新特性的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。