你好啊,我是大阳。
Java 13 于 2019 年 9 月 17 日公布。在这篇文章中,咱们将介绍增加的一些个性以及一些代码示例。
Java13的次要更新内容如下:
- switch表达式改良
- 文本块改良
- 动静CDS档案
- ZGC:勾销提交未应用的内存
- 从新实现 Legacy Socket API
- 其余
1. switch表达式改良
应用yield,咱们当初能够无效地从 switch 表达式返回值,并可能更容易实现策略模式。
package cn.dayangshuo.collectors;/** * @author DAYANG */public class SwitchTest { public static void main(String[] args) { var me = 4; var operation = "平方"; var result = switch (operation) { case "加倍" -> { yield me * 2; } case "平方" -> { yield me * me; } default -> me; }; System.out.println(result); }}
2. 文本块改良
第二个预览性能是多行String的文本块,例如嵌入的 JSON、XML、HTML 等。
早些时候,为了在咱们的代码中嵌入 JSON,咱们将其申明为字符串文字:
String JSON_STRING = "{\r\n" + "\"name\" : \"Baeldung\",\r\n" + "\"website\" : \"https://www.dayangshuo.cn/\"\r\n" + "}";
当初让咱们应用字符串文本块编写雷同的 JSON :
String TEXT_BLOCK_JSON = """{ "name" : "Baeldung", "website" : "https://www.dayangshuo.cn/"}""";
很显著,不须要本义双引号或增加回车。通过应用文本块,嵌入的 JSON 更易于编写,更易于浏览和保护。
3. 动静CDS档案
一段时间以来,类数据共享 (CDS) 始终是 Java HotSpot VM 的一个突出个性。它容许在不同的 JVM 之间共享类元数据,以缩小启动工夫和内存占用。JDK 10 通过增加应用程序 CDS ( AppCDS ) 扩大了这种能力——让开发人员可能在共享存档中蕴含应用程序类。JDK 12 进一步加强了这个个性,默认包含 CDS 归档。
然而,归档应用程序类的过程很繁琐。要生成存档文件,开发人员必须先试运行他们的应用程序以创立类列表,而后将其转储到存档中。之后,该存档可用于在 JVM 之间共享元数据。
通过动静归档,JDK 13 简化了这个过程。当初咱们能够在应用程序退出时生成一个共享存档。这打消了试运行的须要。
要使应用程序可能在默认零碎存档之上创立动静共享存档,咱们须要增加一个选项-XX:ArchiveClassesAtExit并将存档名称指定为参数:
java -XX:ArchiveClassesAtExit=<archive filename> -cp <app jar> AppName
而后,咱们能够应用新创建的存档通过-XX:SharedArchiveFile选项运行雷同的应用程序:
java -XX:SharedArchiveFile=<archive filename> -cp <app jar> AppName
4. ZGC:勾销提交未应用的内存
Java 11 中引入了ZGC作为低提早垃圾收集机制,因而 GC 暂停工夫从未超过 10 毫秒。然而,与 G1 和 Shenandoah 等其余 HotSpot VM GC 不同,它没有装备将未应用的堆内存返回给操作系统的性能。
咱们当初缩小了内存占用并进步了性能。
从 Java 13 开始,ZGC 当初默认将未提交的内存返回给操作系统,直到达到指定的最小堆大小。如果咱们不想应用此性能,咱们能够通过以下形式回到 Java 11 形式:
- 应用选项-XX:-ZUncommit,或
- 设置相等的最小 ( -Xms ) 和最大 ( -Xmx ) 堆大小
此外,ZGC 当初反对的最大堆大小为 16TB。早些时候,限度到4TB 。
5. 从新实现 Legacy Socket API
自 Java 呈现以来,咱们曾经将 Socket(java.net.Socket和java.net.ServerSocket)API 视为 Java 不可或缺的一部分。然而,在过来的二十年里,它们从未现代化。它们是用遗留的 Java 和 C 编写的,既麻烦又难以保护。
Java 13 逆势而上,取代了底层实现,使 API 与将来的用户模式线程保持一致。提供者接口当初指向NioSocketImpl而不是PlainSocketImpl。这个新编码的实现基于与java.nio雷同的外部根底构造。
同样,咱们的确有方法回到应用PlainSocketImpl。咱们能够通过将零碎属性-Djdk.net.usePlainSocketImpl设置为true来启动 JVM,以应用较旧的实现。默认值为NioSocketImpl。
6. 其余
除了下面列出,Java 13 还为咱们带来了一些更显着的变动:
- java.nio –增加了办法*FileSystems.newFileSystem(Path, Map<String, ?>)
- javax.crypto – 反对下一代 MS 密码术 (CNG)
- javax.security – 增加属性jdk.sasl.disabledMechanisms以禁用 SASL 机制
- javax.xml.crypto – 引入新的字符串常量来示意标准 XML 1.1 URI
- javax.xml.parsers - 增加新办法以实例化具备命名空间反对的 DOM 和 SAX 工厂
- Unicode 反对降级到版本 12.1
- 增加了对 Kerberos 主体名称规范化和跨畛域援用的反对