JDK14的重大更新

一.JDK 14版本中的重大更改

1.1 Java SE 14和JDK 14中的一些更改

  • Switch進行了擴展,因此可以用作語句或表達式,以便兩種形式都可以使用傳統case ... :標籤(帶有直通)或新case ... -> 標籤(不帶有直通),還可以使用新的語句從中產生值開關表達式。

    示例:

    "->"以表示如果標籤匹配則僅執行標籤右邊的代碼。建議每種情況允許多個常量,以逗號分隔
    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);
    }
    
    
  • G1進行了增強,以提高非均勻內存訪問(NUMA)存儲系統上的分配性能

    G1的堆組織爲固定大小區域的集合。一個區域通常是一組物理頁面,儘管使用(通過-XX:+UseLargePages)大頁面時,多個區域可能組成一個物理頁面。

    如果+XX:+UseNUMA指定了該選項,則在初始化JVM時,區域將平均分佈在可用NUMA節點的總數上。在開始時固定每個區域的NUMA節點有些不靈活,但是可以通過以下增強來緩解。爲了爲mutator線程分配新的對象,G1可能需要分配一個新的區域。它將通過從NUMA節點中優先選擇一個與當前線程綁定的空閒區域來執行此操作,以便將對象保留在年輕代中的同一NUMA節點上。如果在爲變量分配區域的過程中,同一NUMA節點上沒有空閒區域,則G1將觸發垃圾回收。要評估的另一種想法是,從距離最近的NUMA節點開始,按距離順序在其他NUMA節點中搜索自由區域。

    我們不會嘗試將對象保留在舊版本的同一NUMA節點上。

  • 現在,可以將JDK Flight Recorder數據作爲數據流使用,以進行連續監視。

    描述

    該包裝jdk.jfr.consumer,在模塊jdk.jfr,與功能擴展到訂閱事件異步。用戶可以直接從磁盤存儲庫讀取記錄數據或從磁盤存儲流中讀取數據,而無需轉儲記錄文件。與流進行交互的方式是註冊一個處理程序,例如lambda函數,以響應事件的到來而被調用。

    以下示例顯示了總體CPU使用率和競爭超過10毫秒的鎖定。

    try (var rs = new RecordingStream()) {
      rs.enable("jdk.CPULoad").withPeriod(Duration.ofSeconds(1));
      rs.enable("jdk.JavaMonitorEnter").withThreshold(Duration.ofMillis(10));
      rs.onEvent("jdk.CPULoad", event -> {
        System.out.println(event.getFloat("machineTotal"));
      });
      rs.onEvent("jdk.JavaMonitorEnter", event -> {
        System.out.println(event.getClass("monitorClass"));
      });
      rs.start();
    }
    

    RecordingStream類實現了接口jdk.jfr.consumer.EventStream,該接口提供了一種統一的方式來過濾和使用事件,無論源是實時流還是磁盤上的文件。

  • 添加了新的特定於JDK的文件映射模式,因此該 FileChannelAPI可用於創建 MappedByteBuffer引用非易失性(NVM)內存的實例。

    建議的特定於JDK的API更改

    1. MapMode通過新模塊中的公共API 公開新的枚舉值

    一個新模塊jdk.nio.mapmode將會導出一個同名的新軟件包。一個公共擴展名枚舉ExtendedMapMode將添加到此包中:

    package jdk.nio.mapmode;
    . . .
    public class ExtendedMapMode {
        private ExtendedMapMode() { }
    
        public static final MapMode READ_ONLY_SYNC = . . .
        public static final MapMode READ_WRITE_SYNC = . . .
    }
    

    調用FileChannel::map方法分別創建MappedByteBuffer在NVM設備文件上映射的只讀或讀寫映射時,將使用新的枚舉值。UnsupportedOperationException如果這些標誌在不支持NVM設備文件映射的平臺上傳遞,則將拋出An 。在受支持的平臺上,僅當目標FileChannel實例是從通過NVM設備打開的文件派生時,纔將這些新值作爲參數傳遞。在任何其他情況下,IOException都將拋出。

    ​ 2.發佈BufferPoolMXBean跟蹤持久性MappedByteBuffer統計信息

    ManagementFactory類提供的方法List getPlatformMXBeans(Class)可用於檢索的列表BufferPoolMXBean實例的跟蹤counttotal_capacity以及memory_used用於映射或直接字節緩衝器的現有類別。它將進行修改以返回一個額外的新BufferPoolMXBean名稱"mapped - 'non-volatile memory'",該名稱將跟蹤MappedByteBuffer當前使用模式ExtendedMapMode.READ_ONLY_SYNC或映射的所有實例的上述統計信息ExtendedMapMode.READ_WRITE_SYNC。現有的BufferPoolMXBean以名字mapped只會繼續跟蹤統計MappedByteBuffer情況目前正在與模式映射MapMode.READ_ONLYMapMode.READ_WRITEMapMode.PRIVATE

  • 允許使用特定於區域設置的記帳格式來設置貨幣格式,例如($ 3.27)而不是-$ 3.27。

    可以通過調用帶有“ u-cf-account” Unicode語言環境擴展名的NumberFormat.getCurrencyInstanceInstance(Locale)獲得具有記帳樣式的貨幣格式實例,在某些語言環境中,該格式的金額用括號括起來。例如在Locale.US中,它將格式化爲“($ 3.27)”,而不是“-$ 3.27”。

    更多詳情https://www.unicode.org/reports/tr35/tr35-33/tr35-numbers.html#Currency_Formats

  • 進行了增強,com.sun.management.OperatingSystemMXBean 以確保其根據當前操作環境(例如容器環境)報告值。MXBean用於在操作系統上獲取信息的工具已針對容器環境進行了改進。

    當Java在容器中運行時,許多OperatingSystemMXBean訪問器方法將返回基於主機的信息,而不是特定於容器的數據。

    jdk / open / src / jdk.management / unix / classes / com / sun / management / internal / OperatingSystemImpl.java包含以下提取主機特定數據的本機方法。應該檢查這些方法以確定是否有特定於容器的此信息源。

      private native long getCommittedVirtualMemorySize0();
      private native long getFreePhysicalMemorySize0();
      private native long getFreeSwapSpaceSize0();
      private native long getMaxFileDescriptorCount0();
      private native long getOpenFileDescriptorCount0();
      private native long getProcessCpuTime0();
      private native double getProcessCpuLoad0();
      private native double getSystemCpuLoad0();
      private native long getTotalPhysicalMemorySize0();
      private native long getTotalSwapSpaceSize0();
    

    這些Java方法應該首先嚐試從內部容器Metrics API中提取此信息(如果有)。否則,它應該調用這些現有的本機方法。

    以下是容器度量標準的實現類:

    jdk/open/src/java.base/ share/classes/jdk/internal/platform/Container.java
    jdk/open/src/java.base/share/classes/jdk/internal/platform /Metrics.java
    

1.2 實驗,預覽和孵化器功能

  • Records是 Java語言的預覽功能,它提供了一種緊湊的語法來聲明類,這些類是淺層不可變數據的透明持有者。

    記錄是Java語言中一種新型的類型聲明。像an一樣enum,a record是類的受限形式。它聲明其表示形式,並提交與該表示形式匹配的API。記錄放棄了類通常享有的自由:將API與表示分離的能力。作爲回報,記錄獲得了很大程度的簡潔性。

    記錄具有名稱和狀態描述。狀態描述聲明記錄的組成部分。(可選)記錄具有正文。例如:

    record Point(int x, int y) { }
    

    因爲記錄在語義上聲稱是其數據的簡單,透明持有者,所以記錄會自動獲取許多標準成員:

    • 狀態描述每個組成部分的私有最終字段;
    • 狀態描述的每個組件的公共讀取訪問器方法,其名稱和類型與該組件相同;
    • 一個公共構造函數,其簽名與狀態描述相同,該構造函數根據相應的參數初始化每個字段;
    • 的實現equalshashCode該說兩條記錄是相等的,如果它們是相同類型的並且包含相同的狀態; 和
    • 該實現toString包括所有記錄組件的字符串表示形式及其名稱。

    換句話說,記錄的表示是從狀態描述中機械地,完全地從狀態描述中得出的,構造,解構(最初是訪問器,當我們具有模式匹配時是解構模式),相等性和顯示的協議也是如此。

  • 模式匹配instanceof是一種Java語言預覽功能,可簡化 instanceof-and-cast習慣用法。

    //原來的版本
    if (obj instanceof String) {
        String s = (String) obj;
        // use s
    }
    //新版本
    if (obj instanceof String s || s.length() > 5) {.. s.contains(..) ..}
    
  • 文本塊是多行字符串文字,它避免了大多數轉義序列的需要,以可預測的方式自動設置字符串的格式,並在需要時使開發人員可以控制格式。文本塊在JDK 13中作爲預覽功能引入。通過添加兩個新的轉義序列,可以在JDK 14中再次預覽文本塊。

  • jpackage,這是用於打包自包含Java應用程序的簡單工具。

  • 引入了一種API,該API允許Java程序有效訪問Java堆之外的外部內存。

  • Z垃圾收集器(ZGC)以前僅適用於Linux,是Windows和macOS上的一項實驗性功能

    Windows實現的ZGC需要進行以下工作:

    • *支持多映射內存。*ZGC使用彩色指針需要支持堆多重映射,以便可以從進程地址空間中的多個不同位置訪問同一物理內存。在Windows上,分頁文件支持的內存爲物理內存提供了一個標識(句柄),該標識與映射它的虛擬地址無關。使用此標識,ZGC可以將同一物理內存映射到多個位置。

    • *支持將分頁文件支持的內存映射到保留的地址空間。*Windows內存管理API不如POSIX的mmap / munmap靈活,尤其是在將文件支持的內存映射到以前保留的地址空間區域中時。爲此,ZGC將使用Windows概念的地址空間佔位符。Windows 10和Windows Server版本1803中引入了佔位符概念。不會實現對Windows較早版本的ZGC支持。

    • *支持映射和取消映射堆的任意部分。*ZGC的堆佈局與其動態調整堆頁面大小(以及重新調整大小)相結合,需要支持映射和取消映射任意堆粒子。此要求與Windows地址空間佔位符結合使用時,需要特別注意,因爲佔位符必須由程序顯式拆分/合併,而不是由操作系統自動拆分/合併(如在Linux上)。

    • *支持提交和取消提交堆的任意部分。*ZGC可以在Java程序運行時動態地提交和取消提交物理內存。爲了支持這些操作,物理內存將被劃分爲多個分頁文件段並由其支持。每個分頁文件段都對應一個ZGC堆粒度,並且可以獨立於其他段進行提交和取消提交。

    ZGC的macOS實現由兩部分組成:

    • 支持macOS上的多映射內存。ZGC設計大量使用彩色指針,因此在macOS上我們需要一種將多個虛擬地址(在算法中包含不同顏色)映射到同一物理內存的方法。我們將爲此使用mach microkernel mach_vm_remap API。堆的物理內存在單獨的地址視圖中維護,從概念上講類似於文件描述符,但位於(主要是)連續的虛擬地址中。該內存重新映射到內存的各種ZGC視圖中,代表了算法的不同指針顏色。
    • ZGC支持不連續的內存保留。在Linux上,我們在初始化期間保留16TB的虛擬地址空間。爲此,我們假設沒有共享庫將映射到所需的地址空間。在默認的Linux配置上,這是一個安全的假設。但是,在macOS上,ASLR機制會侵入我們的地址空間,因此ZGC必須允許堆保留不連續。假設VM實現使用單個連續的內存預留,則共享的VM代碼也必須停止。其結果是,GC API,如is_in_reserved()reserved_region()base()將被刪除CollectedHeap

二.刪除的API,工具和組件

2.1 Java SE 14中刪除的API

Packages

java.security.acl      

Interfaces

java.security.acl.Acl
java.security.acl.AclEntry
java.security.acl.Group
java.security.acl.Owner
java.security.acl.Permission
java.util.jar.Pack200.Packer    
java.util.jar.Pack200.Unpacker            

Classes

java.util.jar.Pack200   

2.2JDK 14中刪除的功能和組件

1.刪除併發標記掃描(CMS)垃圾收集器

CMS垃圾收集器已被刪除。

2.刪除Pack200工具和API

Pack200工具和API在JDK 11中已棄用,在JDK 14中已刪除。

pack200unpack200工具,並 Pack200java.util.jar.Pack200包已被刪除。
本文的分享暫時就到這裏,希望對您有所幫助
關注 Java有貨領取更多資料

聯繫小編。微信:372787553,帶您進羣互相學習
左側小編微信,右側獲取免費資料
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章