Java16的新特性

Java語言特性系列

本文主要講述一下Java16的新特性html

版本號

java -version
openjdk version "16" 2021-03-16
OpenJDK Runtime Environment (build 16+36-2231)
OpenJDK 64-Bit Server VM (build 16+36-2231, mixed mode, sharing)
從version信息能夠看出是build 16+36

特性列表

JEP 338: Vector API (Incubator)

提供了jdk.incubator.vector來用於矢量計算,實例以下
static final VectorSpecies<Float> SPECIES = FloatVector.SPECIES_256;

void vectorComputation(float[] a, float[] b, float[] c) {

    for (int i = 0; i < a.length; i += SPECIES.length()) {
        var m = SPECIES.indexInRange(i, a.length);
        // FloatVector va, vb, vc;
        var va = FloatVector.fromArray(SPECIES, a, i, m);
        var vb = FloatVector.fromArray(SPECIES, b, i, m);
        var vc = va.mul(va).
                    add(vb.mul(vb)).
                    neg();
        vc.intoArray(c, i, m);
    }
}

JEP 347: Enable C++14 Language Features

在JDK C++的源碼中容許使用C++14的語言特性

JEP 357: Migrate from Mercurial to Git

OpenJDK源碼的版本控制從Mercurial (hg) 遷移到git

JEP 369: Migrate to GitHub

將OpenJDK源碼的版本控制遷移到 github

JEP 376: ZGC: Concurrent Thread-Stack Processing

實現了併發thread-stack處理來下降GC safepoints的負擔

JEP 380: Unix-Domain Socket Channels

對socket channel及server socket channel的api提供對unix domain socket的支持

JEP 386: Alpine Linux Port

將glibc的jdk移植到使用musl的alpine linux上

JEP 387: Elastic Metaspace

支持再也不使用的class metadata歸還內存給操做系統,下降內存佔用

JEP 388: Windows/AArch64 Port

移植JDK到Windows/AArch64

JEP 389: Foreign Linker API (Incubator)

提供jdk.incubator.foreign來簡化native code的調用

JEP 390: Warnings for Value-Based Classes

提供@jdk.internal.ValueBased來用於標註做爲value-based的類,實例以下
@jdk.internal.ValueBased
public final class SomeVbc {

    public SomeVbc() {}

    final String ref = "String";

    void abuseVbc() {

        synchronized(ref) {           // OK
            synchronized (this) {     // WARN
            }
        }
    }
}

final class AuxilliaryAbuseOfVbc {

    void abuseVbc(SomeVbc vbc) {

        synchronized(this) {           // OK
            synchronized (vbc) {       // WARN
            }
        }
    }
}

JEP 392: Packaging Tool

jpackage在JDK14引入,JDK15做爲incubating工具,在JDK16轉正,從 jdk.incubator.jpackage轉爲 jdk.jpackage。它支持Linux: deb and rpm、macOS: pkg and dmg、Windows: msi and exe

JEP 393: Foreign-Memory Access API (Third Incubator)

Foreign-Memory Access API在JDK14首次引入做爲incubating API,在JDK15處於第二輪incubating,在JDK16處於第三輪incubating

JEP 394: Pattern Matching for instanceof

instanceof的模式匹配在JDK14做爲preview,在JDK15做爲第二輪的preview,在JDK16轉正

JEP 395: Records

Record類型在JDK14做爲preview,在JDK15處於第二輪preview,在JDK16轉正

JEP 396: Strongly Encapsulate JDK Internals by Default

對內部的api進行更多的封裝,鼓勵開發者從使用內部的方法遷移到標準的API,可是 sun.misc.Unsafe仍是繼續保留

JEP 397: Sealed Classes (Second Preview)

Sealed Classes在JDK15做爲preview引入,在JDK16做爲第二輪preview

細項解讀

上面列出的是大方面的特性,除此以外還有一些api的更新及廢棄,主要見JDK 16 Release Notes,這裏舉幾個例子。java

添加項

  • Add InvocationHandler::invokeDefault Method for Proxy's Default Method Support (JDK-8159746)
給InvocationHandler添加invokeDefault方法
  • Day Period Support Added to java.time Formats (JDK-8247781)
java.time支持Day Period
  • Add Stream.toList() Method (JDK-8180352) (JDK-8180352)
Stream新增toList方法
針對G1提供了併發歸還內存給操做系統

移除項

  • Removal of Experimental Features AOT and Graal JIT (JDK-8255616)
移除jaotc工具
  • Deprecated Tracing Flags Are Obsolete and Must Be Replaced With Unified Logging Equivalents (JDK-8256718)
使用 -Xlog:class+load=info替代 -XX:+TraceClassLoading;使用 -Xlog:class+unload=info替代 -XX:+TraceClassUnloading;使用 -Xlog:exceptions=info替代 -XX:+TraceExceptions

廢棄項

  • Terminally Deprecated ThreadGroup stop, destroy, isDestroyed, setDaemon and isDaemon (JDK-8256643)
廢棄ThreadGroup的stop, destroy, isDestroyed, setDaemon, isDaemon方法
  • Deprecated the java.security.cert APIs That Represent DNs as Principal or String Objects (JDK-8241003)
廢棄了java.security.cert.X509Certificate的getIssuerDN()、getSubjectDN()方法

已知問題

  • Incomplete Support for Unix Domain Sockets in Windows 2019 Server (JDK-8259014)
Unix Domain Sockets對Windows 2019 Server的支持還不完善
  • TreeMap.computeIfAbsent Mishandles Existing Entries Whose Values Are null (JDK-8259622)
TreeMap.computeIfAbsent方法針對null的處理與規範有誤差

其餘事項

對Proxy Class進行了加強,支持 jdk.serialProxyInterfaceLimit屬性
  • Support Supplementary Characters in String Case Insensitive Operations (JDK-8248655)
對compareToIgnoreCase、equalsIgnoreCase、regionMatches方法的Case Insensitive語義進行了加強
  • HttpClient.newHttpClient and HttpClient.Builder.build Might Throw UncheckedIOException (JDK-8248006)
HttpClient.newHttpClient及HttpClient.Builder.build方法可能拋出UncheckedIOException
  • The Default HttpClient Implementation Returns Cancelable Futures (JDK-8245462)
默認的HttpClient實現返回Cancelable Futures

小結

Java16主要有以下幾個特性linux

doc

相關文章
相關標籤/搜索