跳至主要內容

JDK13新特性

向往大约 2 分钟后端JDK新特性

[TOC]

switch表达式增强

添加yield关键词,可以有效地从switch表达式返回值。

@Test
@SuppressWarnings("preview")
public void whenSwitchingOnOperationSquareMe_thenWillReturnSquare() {
    var me = 4;
    var operation = "squareMe";
    var result = switch (operation) {
        case "doubleMe" -> {
            yield me * 2;
        }
        case "squareMe" -> {
            yield me * me;
        }
        default -> me;
    };

    assertEquals(16, result);
}

文本块

支持多行文本块,格式如下:

String TEXT_BLOCK_JSON = """
{
    "name" : "xiangwang",
    "website" : "https://blog.xiangwang.tech/"
}
""";

动态CDS归档

类数据共享(CDS)已经成为Java HotSpot VM的一个突出特性。允许在程序退出时动态归档类。它允许跨不同的jvm共享类元数据,以减少启动时间和内存占用。JDK 10通过添加apppcds扩展了这一功能,使开发人员能够在共享归档中包含应用程序类。JDK 12进一步增强了该特性,在默认情况下包括CDS存档。

创建存档:

java -XX:ArchiveClassesAtExit=<archive filename> -cp <app jar> AppName

使用存档:

java -XX:ArchiveClassesAtExit=<archive filename> -cp <app jar> AppName

ZGC优化(增强 ZGC 释放未使用内存)

ZGC是在Java 11中引入的,作为一种低延迟的垃圾收集机制,GC暂停时间从不超过10毫秒。与其他HotSpot VM gc(如G1和Shenandoah)不同的是,它没有将未使用的堆内存返回给操作系统。Java 13将此功能添加到ZGC中。我们现在得到了减少的内存占用和性能改进。

从Java 13开始,ZGC在默认情况下将未提交的内存返回给操作系统,直到达到指定的最小堆大小。如果不想使用此特性,可以通过以下方式

  • 使用选项-XX:-ZUncommit
  • 设置相等的最小堆大小(-Xms)和最大堆大小(-Xmx)

Socket API 重构

在 Java 13 之前,通过使用 PlainSocketImpl 作为 SocketImpl 的具体实现。

Java 13 中的新底层实现,引入 NioSocketImpl 的实现用以替换 SocketImpl 的 PlainSocketImpl 实现,此实现与 NIO(新 I/O)实现共享相同的内部基础结构,并且与现有的缓冲区高速缓存机制集成在一起,因此不需要使用线程堆栈。除了这些更改之外,还有其他一些更便利的更改,如使用 java.lang.ref.Cleaner 机制来关闭套接字(如果 SocketImpl 实现在尚未关闭的套接字上被进行了垃圾收集),以及在轮询时套接字处于非阻塞模式时处理超时操作等方面。