JDK14
针对instanceof的模式匹配,其用法示例如下
通过消除对通用样板代码的需求,提高了开发人员的生产率,并允许使用更简洁的类型安全的代码针对instanceof的模式匹配,其用法示例如下,无需在自己进行类型强转
if (obj instanceof String s) {
// can use s here
} else {
// can't use s here
}
JEP 343:包装工具(孵化)
基于JavaFX工具的基础上创建一个简单的打包工具:javapackager
可以用于构建exe、pkg、dmg、deb、rpm格式的安装文件;非模块化的app的构建示例如下
jpackage --name myapp --input lib --main-jar main.jar
G1的NUMA-Aware内存分配:
通过实施 NUMA 感知内存分配,提高大型计算机上的 G1 性能。
JFR事件流
公开 JDK 飞行记录仪数据以进行持续监控。
模块jdk.jfr中的jdk.jfr.consumer包被扩展为异步订阅事件的功能。用户可以直接从磁盘存储库读取或流式传输记录数据,而无需转储记录文件。与流交互的方法是注册一个处理程序(例如 lambda 函数),以响应事件的到达而调用。
JDK11引入了JFR,使用的时候先dump到磁盘上然后再分析;而在JDK14则支持stream方式来进行持续性的监控
var sender = new JfrStreamEventSender();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", sender); rs.onEvent("jdk.JavaMonitorEnter", sender); rs.start();}
还有 接口jdk.jfr.consumer.EventStream
.有三种工厂方法可用于创建流。EventStream::openRepository(Path) 从磁盘存储库构造流。这是一种通过直接针对文件系统工作来监视其他进程的方法。磁盘存储库的位置存储在系统属性"jdk.jfr.repository"中,可以使用附加 API 读取该属性。还可以使用 EventStream::openRepository() 方法执行进程内监视。与 RecordingStream 不同,它不会启动录制。相反,仅当通过外部方式(例如使用 JCMD 或 JMX)启动录制时,流才会接收事件。方法 EventStream::openFile(Path) 从录制文件创建流。它补充了今天已经存在的PresitedFile类。
非易失性映射字节缓冲区
对FileChannel API进行了扩展,允许创建MappedByteBuffer实例。非易失性内存能够持久化数据,因此可以利用该特性来改进性能
该特性新增了jdk.nio.mapmode.ExtendedMapMode
以支持MappedByteBuffer访问non-volatile memory (NVM)
todo 需要检验这个类路径
实用的NullPointerExceptions
通过精确描述哪个变量为null以及其他有用信息,方便开发人员了解哪个地方出现的空指针
JEP 359:Records
一种新的声明类型
public record Point(int x, int y) {
public Point {
System.out.println(String.format("(%d,%d)", x, y));
}
public Point(int value) {
this(value, value);
}
public static Point of(int value) {
return new Point(value, value);
}
}
反编译
javac --enable-preview -source 15 Point.javajavap -verbose Point.class
// IntelliJ API Decompiler stub source generated from a class file
// Implementation of methods is not availablepackage languageFeature.jdk14;
public final class Point extends java.lang.Record {
private final int x;
private final int y;
public Point(int x, int y) { /* compiled code */ }
public Point(int i) { /* compiled code */ }
public static languageFeature.jdk14.Point of(int i) { /* compiled code */ }
public final java.lang.String toString() { /* compiled code */ }
public final int hashCode() { /* compiled code */ }
public final boolean equals(java.lang.Object o) { /* compiled code */ }
public int x() { /* compiled code */ }
public int y() { /* compiled code */ }}
可以看见Point继承了java.lang.Record,而且通过invokedynamic提供了final的hashCode及equals
Switch表达式
JDK12引入的switch在JDK14变为正式版本,正式版主要是用->
来替代以前的:
+break
;另外就是提供了yield来在block中返回值。在这里允许将switch用作语句或表达式
int numLetters = switch (day) {
case MONDAY, FRIDAY, SUNDAY -> 6;
case TUESDAY -> 7;
case THURSDAY, SATURDAY -> 8;
case WEDNESDAY -> 9;
};
弃用Solaris和SPARC端口
如题
删除并发标记扫描(CMS)垃圾回收器
CMS垃圾收集器在两年前已过时,并且自JDK 6起已成为CMS的后继产品的G1已成为默认GC,并且已经在许多情况下大规模使用。我们还看到引入了两个新的收集器,ZGC(Jdk11)和Shenandoah(Open Jdk12),同时对G1进行了许多改进 。CMS存在几个弊端,比如会产生内存碎片,并发清理后导致用户线程可用的空间不足,因为是并发清理,所以对CPU资源非常敏感,而且无法处理浮动垃圾
ZGC on macOS
之前的ZGC只能在linux上使用,现在mac上也能使用ZGC了
ZGC on Windows
同上
弃用ParallelScavenge + SerialOld GC组合
该组合很少使用,但需要大量维护工作
移除Pack200 API
如题
文本块(二次预览)
在Java 首次将文本块作为预览功能(JEP 355)引入时,收到反馈后,添加了两个新的转义序列(escape sequences)。该功能增强了Java程序中用非Java语言编写代码的字符串的可读性,分别是\<line-terminator>
与\s escape sequence
// 新增“\s”表示空格,“\”表示去除换行
String inOneLine = """
Lorem ipsum dolor sit amet, consectetur adipiscing \
elit, sed do eiusmod tempor incididunt ut labore \
et dolore magna aliqua.\
""";
String colors = """
red \s
green\s
blue \s
""";
JEP 370:外部存储器访问API(孵化)
此孵化器模块引入了一个API,以允许Java程序安全有效地访问操纵堆外内存
SequenceLayout intArrayLayout = MemoryLayout.ofSequence(25, MemoryLayout.ofValueBits(32, ByteOrder.nativeOrder()));
VarHandle intElemHandle = intArrayLayout.varHandle(int.class, MemoryLayout.PathElement.sequenceElement());
try (
MemorySegment segment = MemorySegment.allocateNative(intArrayLayout)) {
MemoryAddress base = segment.baseAddress();
for (int i = 0; i < intArrayLayout.elementCount().getAsLong(); i++) {
intElemHandle.set(base, (long) i, i);
}
}
参考文档
JDK 14 Release Notes, Important Changes, and Information (oracle.com)
The Arrival of Java 14! (oracle.com)
博客