JDK14新特性

JDK14

305:Pattern Matching for instanceof (Preview)
343:Packaging Tool (Incubator)
345:NUMA-Aware Memory Allocation for G1
349:JFR Event Streaming
352:Non-Volatile Mapped Byte Buffers
358:Helpful NullPointerExceptions
359:Records (Preview)
361:Switch Expressions (Standard)
362:Deprecate the Solaris and SPARC Ports
363:Remove the Concurrent Mark Sweep (CMS) Garbage Collector
364:ZGC on macOS
365:ZGC on Windows
366:Deprecate the ParallelScavenge + SerialOld GC Combination
367:Remove the Pack200 Tools and API
368:Text Blocks (Second Preview)
370:Foreign-Memory Access API (Incubator)

针对instanceof的模式匹配,其用法示例如下

Pattern Matching for instanceof (Preview)

通过消除对通用样板代码的需求,提高了开发人员的生产率,并允许使用更简洁的类型安全的代码针对instanceof的模式匹配,其用法示例如下,无需在自己进行类型强转

if (obj instanceof String s) {    
    // can use s here
} else {    
    // can't use s here
}

JEP 343:包装工具(孵化)

Packaging Tool (Incubator)

基于JavaFX工具的基础上创建一个简单的打包工具:javapackager

可以用于构建exe、pkg、dmg、deb、rpm格式的安装文件;非模块化的app的构建示例如下

jpackage --name myapp --input lib --main-jar main.jar

G1的NUMA-Aware内存分配:

NUMA-Aware Memory Allocation for G1

通过实施 NUMA 感知内存分配,提高大型计算机上的 G1 性能。

JFR事件流

JFR Event Streaming

公开 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类。

非易失性映射字节缓冲区

Non-Volatile Mapped Byte Buffers

对FileChannel API进行了扩展,允许创建MappedByteBuffer实例。非易失性内存能够持久化数据,因此可以利用该特性来改进性能

该特性新增了jdk.nio.mapmode.ExtendedMapMode以支持MappedByteBuffer访问non-volatile memory (NVM)

todo 需要检验这个类路径

实用的NullPointerExceptions

Helpful NullPointerExceptions

通过精确描述哪个变量为null以及其他有用信息,方便开发人员了解哪个地方出现的空指针

JEP 359:Records

Records (Preview)

一种新的声明类型

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表达式

Switch Expressions (Standard)

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端口

Deprecate the Solaris and SPARC Ports

如题

删除并发标记扫描(CMS)垃圾回收器

Remove the Concurrent Mark Sweep (CMS) Garbage Collector

CMS垃圾收集器在两年前已过时,并且自JDK 6起已成为CMS的后继产品的G1已成为默认GC,并且已经在许多情况下大规模使用。我们还看到引入了两个新的收集器,ZGC(Jdk11)和Shenandoah(Open Jdk12),同时对G1进行了许多改进 。CMS存在几个弊端,比如会产生内存碎片,并发清理后导致用户线程可用的空间不足,因为是并发清理,所以对CPU资源非常敏感,而且无法处理浮动垃圾

ZGC on macOS

ZGC on macOS

之前的ZGC只能在linux上使用,现在mac上也能使用ZGC了

ZGC on Windows

ZGC on Windows

同上

弃用ParallelScavenge + SerialOld GC组合

Deprecate the ParallelScavenge + SerialOld GC Combination

该组合很少使用,但需要大量维护工作

移除Pack200 API

Remove the Pack200 Tools and API

如题

文本块(二次预览)

Text Blocks (Second Preview)

在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(孵化)

Foreign-Memory Access API (Incubator)

此孵化器模块引入了一个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 (java.net)

JDK 14 Release Notes, Important Changes, and Information (oracle.com)

The Arrival of Java 14! (oracle.com)

博客

Java14的新特性 - SegmentFault 思否

(5条消息) JDK14新特性详解_LIUUUU-CSDN博客_jdk14新特性

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值