关于java:Java-17-将要发布补一下-Java-13-中的新功能

44次阅读

共计 5547 个字符,预计需要花费 14 分钟才能阅读完成。

本文章属于 Java 新个性教程 系列,曾经收录在 Github.com/niumoo/JavaNotes,点个赞,不迷路。

自从 Oracle 调整了 Java 的版本公布节奏之后,Java 版本公布越来越快,尽管都说 Java 版本任他发,我用 Java 8,不过新版本的 Java 性能还是要学习一下的。

Java 13 早在 2019 年 9 月就曾经公布,尽管不是短暂反对版本,然而也带来了不少新性能。

Java 13 官网下载:https://jdk.java.net/archive/

Java 13 官网文档:http://openjdk.java.net/projects/jdk/13/

Java 13 新性能

  1. JEP 350: 动静 CDS 存档
  2. JEP 351: ZGC,偿还未应用的内存 (实验性)
  3. JEP 353: 从新实现 Socket API
  4. JEP 354: Switch 表达式 (二次预览)
  5. JEP 355: 文本块 (预览)

<!– more –>

扩大:此文章属于 Java 新个性教程 系列,会介绍 Java 每个版本的新性能,能够点击浏览。

1. JEP 350 动静 CDS 存档

JVM 启动时有一步是须要在内存中加载类,而如果有多个 jar,加载第一个 jar 的速度是最慢的。这就缩短了程序的启动工夫,为了缩小这个工夫,Java 10 引入了应用程序类数据共享(CDS)机制,它能够把你想共享的类共享在程序之间,使不同的 Java 过程之间共享这个类来缩小这个类占用的空间以及加载速度。不过 Java 10 中应用这个性能的步骤比拟繁琐。

扩大浏览:Java 10 新性能介绍

而 Java 13 中的 AppCDS,容许 Java 利用在程序执行完结时(如果 JVM 没有解体)进行动静存档;存储的内容包含所有加载的利用类型类和应用的类库,这些存储的类库原本并不存在于默认的 CDS 存档中。

应用这个性能非常简单,只须要在程序启动时减少启动参数。

# ArchiveClassesAtExit,程序完结时动静存档
bin/java -XX:ArchiveClassesAtExit=hello.jsa -cp hello.jar Hello
# SharedArchiveFile,应用指定存档启动
bin/java -XX:SharedArchiveFile=hello.jsa -cp hello.jar Hello

2. JEP 351: ZGC,偿还未应用的内存 (实验性)

在 Java 13 之前,ZGC 尽管在清理内存时导致的进展工夫非常少,然而即便内存曾经长时间没有应用,ZGC 也不会将内存返还给操作系统,这对那些非常关注内存占用的应用程序十分不敌对。

比方:

  • 资源按使用量付费的云上容器环境。
  • 利用尽管长时间闲置,然而占用了内存,导致运行的其余程序内存缓和。

而新增的这个性能,能够让 ZGC 偿还长时间没有应用的内存给操作系统,这对某些用户来说非常敌对。

3. JEP 353: 从新实现 Socket API

java.net.Socketjava.net.ServerSocket 类早在 Java 1.0 时就曾经引入了,它们的实现的 Java 代码和 C 语言代码的混合,保护和调试都非常不易;而且这个实现还存在并发问题,有时候排查起来也很艰难。

因而,在 Java 13 中引入了新的实现形式,应用了新的实现 NioSocketImpl 来代替老旧的 PlainSocketImpl 实现。尽管性能雷同,然而老的形式在以后以及将来几个版本内不会删除,用户随时能够通过 -Djdk.net.usePlainSocketImpl 参数切换回老的实现形式,以兼容意外状况。

编写一个测试类能够发现这个变动。

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class Test {public static void main(String[] args) {try (ServerSocket serverSocket = new ServerSocket(8000)){
            boolean running = true;
            while(running){Socket clientSocket = serverSocket.accept();
                //do something with clientSocket
            }
        } catch (IOException e) {e.printStackTrace();
        }
    }
}

应用 Java 13 运行,通过参数 -XX:+TraceClassLoading 追踪加载的类,日志中能够看到 NioSocketImpl

➜  develop ./jdk-13.0.2.jdk/Contents/Home/bin/java -XX:+TraceClassLoading Test.java | grep SocketImpl
[0.699s][info][class,load] java.net.SocketImpl source: jrt:/java.base
[0.699s][info][class,load] java.net.SocketImpl$$Lambda$173/0x0000000800c37440 source: java.net.SocketImpl
[0.702s][info][class,load] sun.net.PlatformSocketImpl source: jrt:/java.base
[0.702s][info][class,load] sun.nio.ch.NioSocketImpl source: jrt:/java.base
[0.713s][info][class,load] sun.nio.ch.NioSocketImpl$FileDescriptorCloser source: jrt:/java.base

但在 Java 12 并不是 NioSocketImpl

➜  develop ./jdk-12.0.2.jdk/Contents/Home/bin/java -XX:+TraceClassLoading Test.java | grep SocketImpl
[0.665s][info][class,load] java.net.SocketImpl source: jrt:/java.base
[0.665s][info][class,load] java.net.AbstractPlainSocketImpl source: jrt:/java.base
[0.665s][info][class,load] java.net.PlainSocketImpl source: jrt:/java.base
[0.665s][info][class,load] java.net.SocksSocketImpl source: jrt:/java.base
[0.666s][info][class,load] java.net.AbstractPlainSocketImpl$1 source: jrt:/java.base

4. JEP 354: Switch 表达式 (二次预览)

你为什么不违心应用应用 switch 表达式?我想其中一个起因应该是,switch 表达式的代码不够好看优雅,甚至有些啰嗦。比方像上面的例子。

package com.wdbyte;

public class Java13Switch {public static void main(String[] args) {
      // 通过传入月份,输入月份所属的节令
      System.out.println(switchJava12Before("march"));
    }
    public static String switchJava12Before(String month) {
        String reuslt = null;
        switch (month) {
            case "march":
            case "april":
            case "may":
                reuslt = "春天";
                break;
            case "june":
            case "july":
            case "august":
                reuslt = "夏天";
                break;
            case "september":
            case "october":
            case "november":
                reuslt = "秋天";
                break;
            case "december":
            case "january":
            case "february":
                reuslt = "冬天";
                break;
        }
        return reuslt;
    }
}

而在 Java 12 中,曾经对 switch 进行了改良,使之能够应用 cast L -> 表达式进行操作,且能够具备返回值,这样代码就更加好看应用了,不过这在 Java 12 中是一个预览性能。

// 通过传入月份,输入月份所属的节令
public static String switchJava12(String month) {return switch (month) {
        case "march", "april", "may"            -> "春天";
        case "june", "july", "august"           -> "夏天";
        case "september", "october", "november" -> "秋天";
        case "december", "january", "february"  -> "冬天";
        default -> "month erro";
    };
}

扩大浏览:Java 12 新个性介绍,JEP 325: Switch 表达式

而当初,在 Java 13 中,又对 switch 表达式进行了加强,减少了yield 关键词用于返回值,相比 break,语义更加明确了。

public static String switchJava13(String month) {return switch (month) {
        case "march", "april", "may":
            yield "春天";
        case "june", "july", "august":
            yield "夏天";
        case "september", "october", "november":
            yield "秋天";
        case "december", "january", "february":
            yield "冬天";
        default:
            yield "month error";
    };
}

5. JEP 355: 文本块 (预览)

在这之前,如果咱们把一个 JSON 赋值给字符串:

String content = "{\n"
    + "\"upperSummary\": null,\n"
    + "\"sensitiveTypeList\": null,\n"
    + "\"gmtModified\": \"2011-08-05 10:50:09\",\n"
    + "\"lowerGraph\": null,\n"
    + "\"signature\": \"\",\n"
    + "\"appName\": \"xxx\",\n"
    + "\"lowerSummary\": null,\n"
    + "\"gmtCreate\": \"2011-08-05 10:50:09\",\n"
    + "\"type\": \"CALL\",\n"
    + "\"name\": \"xxxx\",\n"
    + "\"subType\": \"yyy\",\n"
    + "\"id\": 1,\n"
    + "\"projectId\": 1,\n"
    + "\"status\": 1\n"
    + "}";

终于不必写俊俏的长字符串了,从 Java 13 开始你能够应用文本块的形式定义字符串了。

String content2 = """{"upperSummary": null,"sensitiveTypeList": null,"gmtModified":"2011-08-05 10:50:09","lowerGraph": null,"signature":"",
        "appName": "xxx",
        "lowerSummary": null,
        "gmtCreate": "2011-08-05 10:50:09",
        "type": "CALL",
        "name": "xxxx",
        "subType": "yyy",
        "id": 1,
        "projectId": 1,
        "status": 1
    }
                 """;

不过这是一个预览性能,如果你要是在 Java 13 中应用须要手动开启预览性能,这个性能在 Java 15 中正式公布。

如果你想尝试,能够去下载最新版了,玩的开心。

参考

  1. http://openjdk.java.net/proje…
  2. https://nipafx.dev/java-appli…
  3. https://www.wdbyte.com/2020/0…
  4. https://mkyong.com/java/what-…
  5. Java 新个性教程

相干浏览

  • Java 12 新个性介绍
  • Java 11 新个性介绍
  • Java 10 新个性介绍
  • Java 9 新个性介绍
  • Java 8 函数接口 UnaryOperator
  • Java 8 函数接口 BiPredicate
  • Java 8 函数接口 BiFunction
  • Java 8 函数接口 Supplier
  • Java 8 函数接口 Predicate
  • Java 8 函数接口 Function
  • Java 8 新个性 – forEach 遍历
  • Java 8 新个性 – LocalDate、LocalDateTime 工夫解决介绍
  • Java 8 新个性 – 应用 Optional 优雅的解决空指针
  • Java 8 新个性 – Lambda 表达式、函数接口理解一下
  • Java 8 新个性 – 超强的 Stream 流操作姿态还不学习一下
  • Java 7 新个性 – 和低效 IO 说再见,Files,Paths,Path 文件操作介绍
  • Java 7 新个性 – 新个性 – 快来补一波 Java 7 语法个性

Hello world :)

我是程序猿阿朗,月朗风清的朗,一个每天搬砖的技术工具人。

如果想要订阅,能够关注公众号“未读代码 ”,或者 未读代码博客,或者加我微信(wn8398)。

本文也曾经整顿到 GitHub.com/niumoo/JavaNotes,欢送 Star。

正文完
 0