美文网首页Java
Java13新特性

Java13新特性

作者: TZX_0710 | 来源:发表于2021-06-28 15:02 被阅读0次

Java13新特性描述

2019年9月17日正式发布。本次发布的内容主要ZGC增加、更新Socket实现、Switch表达式更新等方面的改动。

动态应用程序类-数据共享

在Java10中对Java10中引入的应用程序类数据共享进一步的简化、改进和扩展,允许在Java应用程序执行结束时动态进行类归档,具体能被归档的类包括:所有已被加载、但不属于默认基层CDS的应用程序类和引用类库中的类。简单快捷使用cds存档操作。

增强ZGC释放未使用内存

ZGC是Java11引入的最为瞩目的垃圾回收特性,是一种可压缩、低延迟的垃圾收集器,不过在Java11中是实验性的引入,主要用来改善GC停顿时间,并支持几百MB至几个TB级别大小的堆,并且应用吞吐能力下降不会超过15%。目前只支持Linux/x64平台。

Java13对ZGC的改进,主要体现在下面几点

  1. 释放未使用内存给操作系统

  2. 支持最大堆大小未16TB

  3. 添加参数-XX:SoftMaxHeapSize 来软限制堆的大小

软限制堆大小指的是GC应努力是堆大小不要超过指定大小,但是如果实际需要也还是允许GC将堆大小增加到超过SoftMaxHeapSize指定值。如果你想降低堆的占用空间,还想保持临时弹性能力,保持内存的正常运行,不要把 SoftMaxHeapSize设置大于最大堆大小的值。

Java13中,ZGC内存释放功能,默认情况下是开启的,不过可以使用参数:-XX:-ZUncommit 现实关闭,同时如果将最小堆大小配置未等于最大堆大小,则将隐式禁用

延迟释放可以采用参数-XX:ZUncommitDelay = <seconds>控制 默认seconds==300秒。

Socket API重构

Java中的Socket API已经存在了二十多年了,Java13 为Socket API带来了新的底层实现方法,并且在Java13中是默认使用新的Socket实现,使其易于发现并在排除问题同时增加可维护性。Java13之前使用PlainSocketImpl 作为SocketImpl的具体实现。Java13中的新底层实现,引入NioSocketImpl的实现用以替换SocketImpl的PlainSocketImpl实现。为了最小化在重新实现已使用二十多年的方法时出现问题风险,在引入风险的同时,之前版本的实现未被移除。可以通过使用下列属性 以重新使用实现原方法:

-Djdk.net.usePlainSocketImpl = true

注:SocketImpl是一种传统的SPI机制,同时也是一个抽象类,并未制定具体的实现。在使用新实现时,有些情况可能会失败:

  1. 老本笨重PlainSocketImpl中的getInputStream()和getOutPutStream()方法返回的InputStream和OutputStream分别来自于其对应的扩展类型FileInputStream和FileOutputStream
  2. 使用自定义或其他平台的SocketImpl的服务器套接字无法使用其他类型SocketImpl返回Sockets的连接。

Switch表达式扩展(预览功能)

在Java12中引入了Switch表达式作为预览特性,在Java13中对Switch表达式做了增强改进,在块中引入了yield语句来返回值,而不是使用break。这意味着,Switch表达式返回值应该使用yield,而Switch应该使用break。在Java12之前的switch语法如下

  1. Java12之前
private static String hello(int number) {
    String result = "";
    switch (number) {
        case 1, 2:
        result = "one or two";
        break;
        case 3:
        result = "three";
        break;
        case 4, 5, 6:
        result = "four or five or six";
        break;
        default:
        result = "unknown";
        break;
    };
    return result;
}
  1. Java12 改进
private static String hello(int number) {
    String result = switch (number) {
        case 1, 2 -> "one or two";
        case 3 -> "three";
        case 4, 5, 6 -> "four or five or six";
        default -> "unknown";
    };
    return result;
}
  1. Java13
 public static String hello(int day) {
        return switch (day) {
            case 1: {
                yield "zhangsan";
            }
            case 2:
                yield "lisi";
            default:
                throw new IllegalStateException("Unexpected value: " + day);
        };
    }

文本块(预览功能)

一直以来,Java语言在定义字符串的方式是有限的,字符串需要双引号开头,以双引号结尾,这导致字符串不能够多行使用,需要转义符转移或者换行连接支持多行 但这样会增加编辑工作量。

Java3引入了文本块来解决多行文本的问题,文本块以三重双引号开头,并以同样的三重引号结尾终止

 String str= """
                A  B  C
                    Linux
                """;

对于Java13的预览 我们需要意识到预览功能不是beta形式。由于预览还不是规范的一部分,因此有必要编译喝运行时进行明确 。采用参数

$ javac --enable-preview --release 13 HelloWorld.java
$ java --enable-preview Example

相关文章

网友评论

    本文标题:Java13新特性

    本文链接:https://www.haomeiwen.com/subject/jzrqultx.html