共计 2291 个字符,预计需要花费 6 分钟才能阅读完成。
你好啊,我是大阳。
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 主体名称规范化和跨畛域援用的反对