Java 13權威指南 - CodeFX

banq發表於2019-09-20

Java 13在一小時前釋出,這裡有你需要了解的一切:
如果您想自己使用程式碼,請檢視GitHub上的Java X Demo
以下是Java 13最常見的IDE和構建工具的最低版本要求:
  • IntelliJ IDEA:2019.2
  • Eclipse:2019-09(4.13),帶有Java 13支援外掛
  • Maven:3.5.0
    • 編譯器外掛:3.8.0
    • surefire和failsafe:2.22.0
    • 使用ASM的外掛(例如,陰影外掛)也可能需要更新
  • Gradle:6.0

在編譯為Java 13位元組碼時,請記住,您可能必須更新依賴於位元組碼操作的所有依賴項,例如Spring,Hibernate,Mockito等。

如果要使用文字塊或 Switch表示式(有關它們的詳細資訊,請參見下文),請在構建工具配置中包含此內容:

<!-- Maven's pom.xml -->
<plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <release>13</release>
        <compilerArgs>
            --enable-preview
        </compilerArgs>
    </configuration>
</plugin>
<plugin>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
        <argLine>--enable-preview</argLine>
    </configuration>
</plugin>
<plugin>
    <artifactId>maven-failsafe-plugin</artifactId>
    <configuration>
        <argLine>--enable-preview</argLine>
    </configuration>
</plugin>




// Gradle's build.gradle
compileJava {
    options.compilerArgs += ["--enable-preview"]
}
test {
    jvmArgs '--enable-preview'
}


在IntelliJ IDEA中,將模組的語言級別設定為13(預覽)。在Eclipse中,找到Java Compiler配置並選中Enable preview features。

升級到Java 13時獲得的新語法:

文字塊
將跨越多行的字串放入程式碼中一直是Java的難點。現在,20多年後,我們終於得到了易於使用的多行字串,稱為文字塊:

// ugh! 以前寫法
String jsonLiteral = ""
    + "{\n"
    + "\tgreeting: \"Hello\",\n"
    + "\taudience: \"World\",\n"
    + "\tpunctuation: \"!\"\n"
    + "}\n";
// yay! java13寫法
String jsonBlock = """
    {
        greeting: "Hello",
        audience: "World",
        punctuation: "!"
    }
    """;



從Switch表示式返回值
在Java 12和13中引入了Switch表示式。在12中,您將使用break定義返回值 :


boolean result = switch (Bool.random()) {
    case TRUE -> {
        System.out.println("Bool true");
        break true;
    }
    case FALSE -> {
        System.out.println("Bool false");
        break false;
    }
    case FILE_NOT_FOUND -> {
        throw new UncheckedIOException(
            "This is ridiculous!",
            new FileNotFoundException());
    }



Java 13中你需要使用 yield:

boolean result = switch (Bool.random()) {
    case TRUE -> {
        System.out.println("Bool true");
        // `yield` instead of `break`
        yield true;
    }
    case FALSE -> {
        System.out.println("Bool false");
        yield false;
    }
    case FILE_NOT_FOUND -> {
        throw new UncheckedIOException(
            "This is ridiculous!",
            new FileNotFoundException());
    }


新的字串方法
String有三種新方法:

  • String :: stripIndent的行為與編譯器用於刪除文字塊縮排的演算法相同。
  • 類似地, String :: translateEscapes在轉換字串中的轉義序列時公開編譯器的行為。
  • String :: formatted是重新實現靜態方法 String :: format的例項方法 。這意味著要呼叫 “價值:%s” 。formatted (value )等效於 String 。format (“Value:%s” ,value ) ,但更方便一點。


NIO改進
在NIO API中有一些小的改進:

⇝JDK -5029431:新增絕對批次 放置和 獲取方法
⇝JDK -8218418: 檔案。createSymbolicLink應該使用 SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE
⇝ JDK-8215467: 檔案。是否隱藏應返回 真正的 Windows上的隱藏目錄
⇝ JDK-8218875:新增 檔案系統。newFileSystem (Path ,Map < String ,?> ) 方法

Socket和ServerSocket重新實現

Project Loom將引入光纖fibers (由JVM管理的輕量級執行緒),其中一部分是使塊的所有程式碼採用相同的路徑(因為這些路徑隨後被更改為不再阻塞執行緒)。
Java中重要堵塞是在 java.net.Socket 和java.net.ServerSocket下的類,它們的實現非常陳舊,並沒有與Loom的方法一致,因此在準備將來的更改時,此API已重新實現。這對我們來說不應該引起注意。

為AppCDS建立類資料存檔

應用程式類 - 資料共享(AppCDS)在Java 10中免費提供,並在12和13中得到改進。它透過將大部分類載入工作移出來減少啟動時間(減少10%到幾乎50%)和響應時間異常值程式執行。AppCDS不是在需要時從JAR載入類資料,而是準備一個不可變的歸檔檔案,並在JVM啟動時將其對映到記憶體中。(或“JVM”,因為存檔可以在多個例項之間共享。)
在Java 10上,使用存檔過去是一個三步過程:

  • 建立要歸檔的類列表
  • 建立檔案
  • 與存檔一起釋出

Java 12透過引入JVM附帶並自動使用的JDK類的預設存檔來放寬這一點。但您仍然必須完成上述步驟才能建立包含應用程式類的存檔。這就是Java 13發揮作用的地方。
新的選項 - XX:ArchiveClassesAtExit告訴JVM照常執行,但退出(如果它沒有崩潰),對類資料寫入到指定的檔案。然後可以將其用於未來的計劃釋出:


# run without CDS & create archive
java
    -XX:ArchiveClassesAtExit=dyn-cds.jsa
    -jar target/java-x.jar
 
# use created archive
java
    -XX:SharedArchiveFile=dyn-cds.jsa
    -jar target/java-x.jar



此方法使用所謂的動態CDS存檔,使該功能更易於使用。如果您關心反射啟動時間,請試一試!

ZGC使用記憶體

Oracle的Z垃圾收集器(ZGC)是一種可擴充套件的低延遲垃圾收集器,旨在滿足獨立於堆或實時集大小(從幾百MB到幾TB)的暫停時間,並保持在10 ms以下。在Java 13中,堆大小可以是16 TB,ZGC可以將未使用的記憶體返回給作業系統。命令列引數 - XX:ZUncommitDelay = <秒>可以用於配置當發生這種情況。
然後有一個新的命令列標誌 - XX:SoftMaxHeapSize,通知垃圾收集器,試圖限制堆到指定的大小。如果本來耗盡記憶體,它允許使用更多的記憶體,-Xmx就應該可以很好地用於返回未使用的記憶體。

 

相關文章