JDK16
孵化阶段的矢量API(孵化)
jdk.incubator.vector,以表达在可支持的CPU架构上编译为最佳硬件指令的矢量计算,以实现优于等效标量计算的性能。
// Example 1
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);
}
}
// Example 2
static final VectorSpecies<Float> SPECIES = FloatVector.SPECIES_256;
void vectorComputation(float[] a, float[] b, float[] c) {
int i = 0;
int upperBound = SPECIES.loopBound(a.length);
for (; i < upperBound; i += SPECIES.length()) {
// FloatVector va, vb, vc;
var va = FloatVector.fromArray(SPECIES, a, i);
var vb = FloatVector.fromArray(SPECIES, b, i);
var vc = va.mul(va).
add(vb.mul(vb)).
neg();
vc.intoArray(c, i);
}
for (; i < a.length; i++) {
c[i] = (a[i] * a[i] + b[i] * b[i]) * -1.0f;
}
}
启用C++ 14语言功能
启用C++ 14语言功能,允许在JDK C++源代码中使用C++ 14功能,并提供有关在HotSpot代码中可以使用哪些功能的具体指导。
OpenJDK源代码仓库从Mercurial迁移至Git。
如题
迁移到GitHub
这个变化是基于OpenJDK源码库迁移至Git的,JDK 16源代码仓库将出现在最流行的程序员社交网站上。
ZGC:并发线程堆栈处理
ZGC垃圾收集器旨在使HotSpot中的GC暂停和可伸缩性问题成为过去。实现了并发thread-stack处理来降低GC safepoints的负担
Unix-Domain Socket Channels
对socket channel及server socket channel的api提供对unix domain socket的支持,其中Unix-Domain(AF_UNIX)套接字的支持被添加到nio.channels包中的Socket Channel和Server Socket Channel API中。
Alpine Linux移植
在x64和AArch64架构上,将JDK移植到Alpine Linux和其他使用musl作为其主要C库的Linux发行版。Musl是 ISO C和Posix标准中描述的标准库功能的Linux实现。Alpine Linux由于其镜像小而被广泛应用于云部署、微服务以及容器环境中。Linux版本的Docker容器镜像小于6MB。让Java在此类设置中开箱即用地运行,并允许Tomcat、Jetty、Spring和其它流行的框架在这些环境中工作。通过使用jlink来减少Java运行时的大小,用户可以创建一个更小的镜像,以运行特定的应用程序。
弹性Metaspace
更及时地将未使用的HotSpot类元空间(Metaspace)内存返回给操作系统,减少元空间占用空间,并简化元空间代码,以降低维护成本。
Windows/AArch64
将JDK移植到Windows/AArch64平台
外部链接程序API(孵化)
孵化阶段的外部链接程序API,支持静态类型的纯Java方式访问本地代码。此计划的目的在于通过用更高级的纯Java开发模式来替换JNI(Java本机接口),以提供与C语言的交互。它的性能将会比JNI更加优越。
提供jdk.incubator.foreign来简化native code的调用
基于值的类的警告建议
将原始包装类指定为基于值的类,弃用其构造函数以进行移除,并提示新的弃用警告。在Java平台中对于任何基于值的类的实例进行同步的错误尝试会予以警告。
提供@jdk.internal.ValueBased来用于标注作为value-based的类
Double d = 20.0;
synchronized (d) { ... } // javac warning & HotSpot warning
Object o = d;
synchronized (o) { ... } // HotSpot warning
// -------------------------------------
@jdk.internal.ValueBased
public final class SomeVbc {
public SomeVbc() {}
final String ref = "String";
void abuseVbc() {
synchronized(ref) { // OK
synchronized (this) { // WARN
}
}
}
}
jpackage工具
jpackage在JDK14引入,JDK15作为incubating工具,在JDK16转正,从jdk.incubator.jpackage
转为jdk.jpackage
。它支持Linux: deb and rpm、macOS: pkg and dmg、Windows: msi and exe。提供用于打包独立的Java应用程序的jpackage工具。
外部内存访问API
Foreign-Memory Access API在JDK14首次引入作为incubating API,在JDK15处于第二轮incubating,在JDK16处于第三轮incubating
instanceof操作符的模式匹配
在JDK 14和JDK 15中都已预览过,将于JDK 16最终确定。模式匹配使程序中的通用逻辑(即从对象中有条件的提取组件)可以更简洁、安全的表达。
Record
提供Record记录类,作为不可变数据的透明载体。在JDK14作为preview,在JDK15处于第二轮preview,在JDK16转正。
默认强封装 JDK 内部组件
默认情况下,JDK内部结构是强封装的,而关键内部API(例如misc.Unsafe)除外。此计划的目标包括提高JDK的安全性和可维护性,并鼓励开发人员从直接使用内部元素逐渐迁移为使用标准API,这样开发人员和最终用户都可以轻松地升级到 Java 的未来版本。
密封类
之前在JDK 15中进行过预览,JDK 16中二次预览的密封类和接口限制了可以扩展或实现它们的类和接口。此计划的目标包括允许类或接口的创建者控制负责实现它的代码,提供比访问修饰符更声明性的方式来限制超类的使用,并通过提供模式分析基础来支持模式匹配的未来发展。
参考资料
JDK 16 Release Notes, Important Changes, and Information (oracle.com)
[The Arrival of Java 16 (oracle.com)](https://blogs.oracle.com/java/post/the-arrival-of-java-16)
博客