JDK15安裝與Java15新特性講解,有點想升級,終於要廢棄偏向鎖了!

  • 發佈版本說明html

  • 安裝包下載java

  • 安裝、驗證算法

  • JDK 15 新特性講解編程

JDK 15已經於2020年9月15日如期發佈。本文重點介紹JDK 15新特性:windows


發佈版本說明

根據發佈的規劃,此次發佈的 JDK 15 將是一個短時間的過分版,只會被 Oracle 支持(維護)6 個月,直到明年 3 月的 JDK 16 發佈此版本將中止維護。而 Oracle 下一個長期支持版(LTS 版)會在明年的 9 月份發佈(Java 17),LTS 版每 3 年發佈一個,上一次長期支持版是 18 年 9 月發佈的 JDK 11。下圖展現了各個版本的發佈歷史。安全



安裝包下載

主要分爲OpenJDK版本和Oracle版本,下載地址以下:oracle

  • OpenJDK版本:https://jdk.java.net/15/框架

  • Oracle版本:http://www.oracle.com/technetwork/java/javase/downloads/index.html編程語言

  • 網盤各版本JDK:https://pan.baidu.com/s/1i2dd2cJh5wTUu9HzR-FI6g ide

    提取碼:pi4c

上述版本,若是是我的學習用途,則差別不大。但若是是用於商業用途,則須要仔細看好相關的受權。Oracle JDK根據二進制代碼許可協議得到許可,而OpenJDK根據GPL v2許可得到許可。


安裝、驗證

本例子以OpenJDK版本爲例。解壓安裝包openjdk-15_windows-x64_bin.zip到任意位置。

設置系統環境變量「JAVA_HOME」,以下圖所示。

在用戶變量「Path」中,增長「%JAVA_HOME%\bin」。

安裝完成後,執行下面命令進行驗證:

>java -version
openjdk version "15" 2020-09-15
OpenJDK Runtime Environment (build 15+36-1562)
OpenJDK 64-Bit Server VM (build 15+36-1562, mixed mode, sharing)


JDK 15 新特性講解

JDK 15 爲用戶提供了14項主要的加強/更改,包括一個孵化器模塊,三個預覽功能,兩個不推薦使用的功能以及兩個刪除功能。

1. EdDSA 數字簽名算法

新加入 Edwards-Curve 數字簽名算法(EdDSA)實現加密簽名。在許多其它加密庫(如 OpenSSL 和 BoringSSL)中獲得支持。與 JDK 中的現有簽名方案相比,EdDSA 具備更高的安全性和性能。這是一個新的功能。

使用示例以下:

// example: generate a key pair and sign
KeyPairGenerator kpg = KeyPairGenerator.getInstance("Ed25519");
KeyPair kp = kpg.generateKeyPair();
// algorithm is pure Ed25519
Signature sig = Signature.getInstance("Ed25519");
sig.initSign(kp.getPrivate());
sig.update(msg);
byte[] s = sig.sign();

// example: use KeyFactory to contruct a public key
KeyFactory kf = KeyFactory.getInstance("EdDSA");
boolean xOdd = ...
BigInteger y = ...
NamedParameterSpec paramSpec = new NamedParameterSpec("Ed25519");
EdECPublicKeySpec pubSpec = new EdECPublicKeySpec(paramSpec, new EdPoint(xOdd, y));
PublicKey pubKey = kf.generatePublic(pubSpec);

有關EdDSA 數字簽名算法的詳細內容見RFC 8032規範。

2. 封閉類(預覽特性)

能夠是封閉類和或者封閉接口,用來加強 Java 編程語言,防止其餘類或接口擴展或實現它們。

有了這個特性,意味着之後不是你想繼承就繼承,想實現就實現了,你得通過容許才行。

示例以下:

public abstract sealed class Student
    permits ZhangSan, LiSi, ZhaoLiu {
    ...

}

類 Student 被 sealed 修飾,說明它是一個封閉類,而且只容許指定的 3 個子類繼承。

3. 隱藏類

此功能可幫助須要在運行時生成類的框架。框架生成類須要動態擴展其行爲,可是又但願限制對這些類的訪問。隱藏類頗有用,由於它們只能經過反射訪問,而不能從普通字節碼訪問。此外,隱藏類能夠獨立於其餘類加載,這能夠減小框架的內存佔用。這是一個新的功能。

4. 移除了 Nashorn JavaScript 腳本引擎

移除了 Nashorn JavaScript 腳本引擎、APIs,以及 jjs 工具。這些早在 JDK 11 中就已經被標記爲 deprecated 了,JDK 15 被移除就很正常了。

Nashorn 是 JDK 1.8 引入的一個 JavaScript 腳本引擎,用來取代 Rhino 腳本引擎。Nashorn 是 ECMAScript-262 5.1 的完整實現,加強了 Java 和 JavaScript 的兼容性,而且大大提高了性能。

那麼爲何要移除?

官方的解釋是主要的:隨着 ECMAScript 腳本語言的結構、API 的改編速度愈來愈快,維護 Nashorn 太有挑戰性了,因此……。

5. 從新實現 DatagramSocket API

從新實現舊版 DatagramSocket API,更簡單、更現代的實現來代替java.net.DatagramSocket和java.net.MulticastSocketAPI 的基礎實現,提升了 JDK 的可維護性和穩定性。

新的底層實現將很容易使用虛擬線程,目前正在 Loom 項目中進行探索。這也是 JEP 353 的後續更新版本,JEP 353 已經從新實現了 Socket API。


6. 準備禁用和廢除偏向鎖

在 JDK 15 中,默認狀況下禁用偏向鎖(Biased Locking),並棄用全部相關的命令行選項。

後面再肯定是否須要繼續支持偏向鎖,由於維護這種鎖同步優化的成本過高了。

7. 模式匹配(第二次預覽)

第一次預覽是 JDK 14 中提出來的,點擊這裏查看我以前寫的詳細教程。

Java 14 以前用法:

if (obj instanceof String) {
    String s = (String) obj;
    // 使用s
}

Java 14以後的用法:

if (obj instanceof String s) {
    // 使用s
}

Java 15 並無對此特性進行調整,繼續預覽特性,只是爲了收集更多的用戶反饋,可能還不成熟吧。

8. ZGC 功能轉正

ZGC是一個可伸縮、低延遲的垃圾回收器。

ZGC 已由JEP 333集成到JDK 11 中,其目標是經過減小 GC 停頓時間來提升性能。藉助 JEP 377,JDK 15 將 ZGC 垃圾收集器從預覽特性變動爲正式特性而已,沒錯,轉正了。

這個 JEP 不會更改默認的 GC,默認仍然是 G1。

9. 文本塊功能轉正

文本塊,是一個多行字符串,它能夠避免使用大多數轉義符號,自動以可預測的方式格式化字符串,並讓開發人員在須要時能夠控制格式。

文本塊最先準備在 JDK 12 添加的,但最終撤消了,而後在 JDK 13 中做爲預覽特性進行了添加,而後又在 JDK 14 中再次預覽,在 JDK 15 中,文本塊終於轉正,暫再也不作進一步的更改。

Java 13 以前用法,使用one-dimensional的字符串語法:

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

Java 13 以後用法,使用two-dimensional文本塊語法:

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

10. Shenandoah 垃圾回收算法轉正

Shenandoah 垃圾回收從實驗特性變爲產品特性。這是一個從 JDK 12 引入的回收算法,該算法經過與正在運行的 Java 線程同時進行疏散工做來減小 GC 暫停時間。Shenandoah 的暫停時間與堆大小無關,不管堆棧是 200 MB 仍是 200 GB,都具備相同的一致暫停時間。

JDK 15 Shenandoah垃圾收集器從預覽特性變動爲正式特性而已,沒錯,又是轉正了。

11. 移除了 Solaris 和 SPARC 端口。

移除了 Solaris/SPARC、Solaris/x64 和 Linux/SPARC 端口的源代碼及構建支持。這些端口在 JDK 14 中就已經被標記爲 deprecated 了,JDK 15 被移除也不奇怪。

12. 外部存儲器訪問 API(二次孵化)

這個最先在 JDK 14 中成爲孵化特性,JDK 15 繼續二次孵化並對其 API 有了一些更新。

目的是引入一個 API,以容許 Java 程序安全有效地訪問 Java 堆以外的外部內存。這一樣是 Java 14 的一個預覽特性。

13. Records Class(二次預覽)

Records Class 也是第二次出現的預覽功能,它在 JDK 14 中也出現過一次了,使用 Record 能夠更方便的建立一個常量類,使用的先後代碼對好比下。

舊寫法:

class Point {
    private final int x;
    private final int y;

    Point(int x, int y) {
        this.x = x;
        this.y = y;
    }

    int x() { return x; }
    int y() { return y; }

    public boolean equals(Object o) {
        if (!(o instanceof Point)) return false;
        Point other = (Point) o;
        return other.x == x && other.y = y;
    }

    public int hashCode() {
        return Objects.hash(x, y);
    }

    public String toString() {
        return String.format("Point[x=%d, y=%d]", x, y);
    }
}

新寫法:

record Point(int x, int y) { }

也就是說在使用了 record 以後,就能夠用一行代碼編寫出一個常量類,而且這個常量類還包含了構造方法、toString()、equals() 和 hashCode() 等方法。

14. 廢除 RMI 激活

廢除 RMI 激活,以便在未來進行刪除。須要說明的是,RMI 激活是 RMI 中一個過期的組件,自 Java 8 以來一直是可選的。

相關文章
相關標籤/搜索