精华内容
下载资源
问答
  • JDK16发布了!

    千次阅读 2021-03-18 17:17:56
    JDK16已于北美时间3月16日发布,对Java开发者来说,JDK的这次更新总共带来了12个全新的特性1. 支持类型匹配的instanceofif(objinstanceofStri...

    JDK16已于北美时间3月16日发布,对Java开发者来说,JDK的这次更新总共带来了12个全新的特性

    1. 支持类型匹配的instanceof

    if (obj instanceof String) {
        String s = (String) obj;    // grr...
        ...
    }
    

    这样的类型转换在JDK16中的写法是:

    if (obj instanceof String s) {
        // Let pattern matching do the work!
        // varialble s can be used here
        ...
    }
    

    如果obj的真实类型是String,则变量s可以在if语句中使用,但是如果obj的类型不是String,则s不能用在后续的变量命名中:

    // a is not instance of Point
    if (a instanceof Point p) {
       ...
    }
    if (b instanceof Point p) {         // ERROR - p is in scope
       ...
    }
    

    2. record关键字

    对于一些POJO类,我们往往需要这样写

    class Point {
        private final int x;
        private final int y;
    
        Point(int x, int y) {
            this.x = x;
            this.y = y;
        }
    
        int x() { return x; }
        int y() { return y; }
    
        public boolean equals(Object o) {
            if (!(o instanceof Point)) return false;
            Point other = (Point) o;
            return other.x == x && other.y == y;
        }
    
        public int hashCode() {
            return Objects.hash(x, y);
        }
    
        public String toString() {
            return String.format("Point[x=%d, y=%d]", x, y);
        }
    }
    

    在引入了record关键字之后,上面的代码可以简化为:

    record Point(int x, int y) { }
    

    如果对类的属性初始化的时候有定制逻辑,也是支持的

    record Rational(int num, int denom) {
        Rational {
            int gcd = gcd(num, denom);
            num /= gcd;
            denom /= gcd;
        }
    }
    

    3.全并发的ZGC

    与CMS中的ParNew和G1类似,ZGC也采用标记-复制算法,不过ZGC对该算法做了重大改进:ZGC在标记、转移和重定位阶段几乎都是并发的,这是ZGC实现停顿时间小于10ms目标的最关键原因。

    ZGC只有三个STW阶段:初始标记,再标记,初始转移。其中,初始标记和初始转移分别都只需要扫描所有GC Roots,其处理时间和GC Roots的数量成正比,一般情况耗时非常短;再标记阶段STW时间很短,最多1ms,超过1ms则再次进入并发标记阶段。即,ZGC几乎所有暂停都只依赖于GC Roots集合大小,停顿时间不会随着堆的大小或者活跃对象的大小而增加。与ZGC对比,G1的转移阶段完全STW的,且停顿时间随存活对象的大小增加而增加。

    4. 可弹性伸缩的元数据区

    JDK16对元数据区切分为更小的内存块,并将不再使用的内存快速返还给操作系统,对于频繁加载和卸载类的应用来说这一优化可以产生大量的空闲内存,提升整个JVM的性能

    5. 支持Unix套接字

    在2019 Windows Server和Windows 10提供了对Unix套接字的支持,Unix套接字常用于本地进程之间通信,相比于TCP协议,本地进程使用Unix套接字可以更高效安全的通信。JDK16新增了一个适配Unix套接字的新接口java.net.UnixDomainSocketAddress用于支持这一特性

    6. 新的打包工具jpackage

    支持将Java程序打包为对应平台的可执行程序

    • linux: deb和rpm

    • mac: pkg和dmg

    • Windows: msi和exe 假如我们在lib目录下有一个jar包组成的应用,并且main.jar包含main方法,则可以使用下面的语句产生对应平台的可执行程序

    jpackage --name myapp --input lib --main-jar main.jar
    

    如果main.jar的MANIFEST.MF没有指定main函数,则需要在命令行中指定

    jpackage --name myapp --input lib --main-jar main.jar \
      --main-class myapp.Main
    

    7. 针对Value-Based类的编译器warning提示

    对于基本类型的包装类,JDK16提供了两种新的编译器warning提示

    • 包装类的构造函数在JDK9已经被废弃,如果在程序中继续使用,则编译器会报warning提示

    • 如果包装类作为关键字synchronized的参数使用,则也会收到编译器的warning提示

    • 如果接口类作为关键字synchronized的参数使用,则会收到javac编译器的warning提示 举例:

    Double d = 20.0;
    synchronized (d) { ... } // javac warning & HotSpot warning
    Object o = d;
    synchronized (o) { ... } // HotSpot warning
    

    8. 对JDK内部方法提供强制的封装

    这个更新目的是为了引导开发者放弃使用JDK内部类转为使标准的API接口,除了例如sun.misc.Unsafe这样内部关键的接口之外,其他所有内部元素都提供默认的封装。使用了JDK内部接口的代码再JDK16下编译会失败,JVM参数-–illegal-access能够控制这一行为,要知道从JDK9到JDK15,这个参数默认的值都是warning,而现在已经变成了deny

    9. 提供向量计算的API

    之前向量计算的API在JDK中是缺失的,常见的二方库有coltcommons-math3,这些二方库在版本老旧,在易用性上也比较差,此次JDK16引入的向量计算的API针对多数现代CPU使用的SIMD指令进行了优化,大幅提升了计算性能

    10. 对原生代码的调用提供更方便的支持

    相比于JNI,提供更方便的方法用于调用原生代码,比如我们想在Java代码中调用size_t strlen(const char *s);这个原生C函数,我们只需要这样写:

    MethodHandle strlen = CLinker.getInstance().downcallHandle(
            LibraryLookup.ofDefault().lookup("strlen"),
            MethodType.methodType(long.class, MemoryAddress.class),
            FunctionDescriptor.of(C_LONG, C_POINTER)
        );
    

    11. 提供操作外部内存的能力

    JDK16通过VarHandle这个类的实例来引用外部内存区域,如果我们想初始化一段外部的内存区域,可以这样写:

    VarHandle intHandle = MemoryHandles.varHandle(int.class,
            ByteOrder.nativeOrder());
    
    try (MemorySegment segment = MemorySegment.allocateNative(100)) {
        for (int i = 0; i < 25; i++) {
            intHandle.set(segment, i * 4, i);
        }
    }
    

    12. 提供限制可以继承此类的关键字sealedpermits

    在JDK16中,提供了一种比访问修饰符更精细的控制手段:可以指定可以继承或者实现当前类或者接口的类,这个能力是通过关键字sealedpermits实现的

    public abstract sealed class Shape 
        permits com.example.polar.Circle,
                com.example.quad.Rectangle,
                com.example.quad.simple.Square { ... }
    

    比如在上面的这个例子中,类Shape只能限定被Circle,RectangleSquare继承

    有道无术,术可成;有术无道,止于术

    欢迎大家关注Java之道公众号

    好文章,我在看❤️

    展开全文
  • JDK 16

    2021-01-03 15:05:05
    根据发布计划,JDK 16 将在 12 月 10 日和 2021 年 1 月 14 进入 Rampdown 阶段,2021 年 2 月 4 日到 2 月 18 日进入发布候选阶段。 最终版本预计于 2021 年 3 月 16 日正式发布。 日前, JDK 16 揭晓了即将到来...

    当开发者深陷 Java 8 版本之际,这边下一版本 Java 16 有了最新的消息,与 Java 15 一样,作为短期版本,Oracle 仅提供 6 个月的支持。

    根据发布计划,JDK 16 将在 12 月 10 日和 2021 年 1 月 14 进入 Rampdown 阶段,2021 年 2 月 4 日到 2 月 18 日进入发布候选阶段。

    最终版本预计于 2021 年 3 月 16 日正式发布。

    日前, JDK 16 揭晓了即将到来的新功能,接下来,我们将一睹为快:

    • 以前在 JDK 15 中预览的密封类和接口限制其他类和接口可以扩展或实现它们。该计划的目标包括,允许类或接口的作者控制负责实现它的代码,提供比访问修饰符更声明性的方式来限制超类的使用,以及通过提供模式分析的基础来支持模式匹配的未来方向。

    • 默认情况下,对 JDK 内部进行强封装,但关键内部 API(如 misc.Unsafe ) 除外。用户可以选择自 JDK 9 以来默认的宽松强封装。此建议的目标包括提高 JDK 的安全性和可维护性,作为项目 Jigsaw 的一部分,并鼓励开发人员从使用内部元素迁移到使用标准 API,以便开发人员和最终用户都可以轻松地更新到未来的 Java 版本。

    • 外部链接程序 API,提供静态类型、纯 Java 对本机代码的访问。此 API 将在 JDK 16 中处于孵化器阶段。

    • 将 ZGC(Z 垃圾收集器)线程堆栈处理从安全点移动到并发阶段。此计划的目标包括从 ZGC 安全点中删除线程堆栈处理。

    • 弹性元空间功能,它将可以更迅速地将未使用的 HotSpot VM 类元数据(元空间)内存返回到操作系统,减少元空间占用空间并简化元空间代码以降低维护成本。

    • 启用 C++ 14 语言功能,允许在 JDK C++ 源代码中使用C++ 14功能,并提供有关部分功能可用于 HotSpot VM 代码的特定指导。

    • 孵化器阶段的向量 API,其中 JDK 将安装一个孵化器模块,用于表示编译为支持的 CPU 体系结构上的最佳矢量硬件指令的矢量计算,以实现与等效标量计算更高的性能。

    • 将 JDK 移植到 Windows/AArch64 平台。随着新的服务器级和使用者 AArch64 (ARM64) 硬件的发布,Windows/AArch64 已成为一个重要的平台。

    • 在 x64 和 AArch64 体系结构上,将 JDK 移植到 Alpine Linux 和其他使用 musl 作为主 C 库的 Linux 发行版。Musl 是 ISO C 和 Posix 标准中描述的标准库功能的 Linux 实现。由于云部署、微服务和容器环境,Alpine Linux 由于其映像大小较小,因此被广泛采用。

    • 为不可变数据提供充当透明载体的记录类。

    • 增加 Unix 域套接字通道,其中 Unix 域 (AF_UNIX) 套接字支持添加到 nio.channels 包中的套接字通道和服务器套接字通道 API 中。该计划还扩展了继承的通道机制,以支持 Unix 域套接字通道和服务器套接字通道。Unix 域套接字用于同一主机上的进程间通信。它们在很多方面与 TCP/IP 套接字类似,只是它们由文件系统路径名称而不是 IP 地址和端口号寻址。新功能的目标是支持 Unix 域套接字通道的所有功能,这些功能在主要 Unix 平台和 Windows 中很常见。

    • 一种外部存储器访问 API,允许 Java 程序安全地访问 Java 堆以外的外部存储器。这一功能将在 JDK 16 中重新孵化。优化的目标包括提供单个 API 以对各种外部存储器(包括本机、持久和托管堆内存)进行操作,API 不应破坏 JVM 的安全性。此外,许多 Java 程序应访问外部存储器,如Lgnite、Memcached 和 MapDB。但是 JavaAPI 不能提供令人满意的访问外部内存 .MemorySegmentMemoryAddresses 的解决方案。

    • 用于运算符的模式匹配(该功能也在 JDK 14/15 版本中实现了预览)。在 JDK 16 上,模式匹配允许程序中的通用逻辑,即从对象中提取组件,可以更简洁、更安全地表达.instanceof 运算符。

    • 提供用于打包独立的 Java应用程序 jpackage 工具。最初作为 JDK 14 中的孵化工具,jpackage在 JDK 15中仍然处于孵化期。预计到 JDK 16 版本,jpackage 将会进入生产环境中,支持本地包格式,并为用户提供流畅的安装体验,以及允许在打包时指定启动时间参数。格式包括 Windows 上的 msi 和 exe、 MacOs 上的 pkg 和 dmg、以及 Linux 上的 deb 和 rpm 。该工具可以直接从命令行调用,也可以以编程方式调用。新的打包工具解决了许多 Java 应用程序需要以一流的方式安装在本机平台上,而不是放置在类路径或模块路径上等问题。

    • OpenJDK 源代码存储库从 Mercurial 迁移到 Git。推动这项工作是借助版本控制系统元数据和可用工具及托管方面的优势。

    • 借助 JEP 369,托管平台迁移到 GitHub。在今年 9 月 5 日,Mercurial JDK 和 JDK 沙盒向 Git、GitHub 和 Skara 的过渡工作已实现。

    继 Java 16 之后,Java 17 将于 2021 年 9 月发布,这是长期支持(LTS)版本,因此身处研发前线的开发者可以再等等。

    对此,你期待新版 Java 的到来吗?

    参考链接:

    https://www.infoworld.com/article/3569150/jdk-16-the-new-features-in-java-16.html

     

     

    展开全文
  • 当我们开发者与大多企业还停留在JDK8的时候,JDK16即将问世,你准备好了吗? 郑重申明: 第一次冒险翻译专业领域的文献,可想而知,效果特别糟糕。一般翻译文献特别是 技术专业领域 的内容,因为涉及到很多专业...

    岁月无声,岁月有声.2020实鼠不易,2021牛转乾坤。 当我们开发者与大多企业还停留在JDK8的时候,JDK16即将问世,你准备好了吗?
    郑重申明:
    第一次冒险翻译专业领域的文献,可想而知,效果特别糟糕。一般翻译文献特别是 技术专业领域 的内容,因为涉及到很多专业术语、业内常用语,很多词汇你在翻译软件根本找不到,并且大部分知识点技术都是成体系的、相互关联的、多版本迭代的、有历史原因的等等,因此要求你本身必须清楚每个技术点的前因后果和逻辑关系,否则翻译起来特别耗费时间精力,因为不断翻阅参考文献了解学习和推敲揣摩,但其实徒劳无功,因为很多你到最后还是没看明白。而此次翻译的 JDK 16 新特性 文献内容,确实是难上之难。

    前言
    到2021年3月,下一版本的 Java 升级发布将聚焦在原始类、密封类、记录类、矢量类接口,以及用于 Windows ARM64 和 Alpine Linux 的端口上。

    JDK 16 新增了基于值的类警告和密封类(第二次预览)作为计划功能,还加入了一系列新的特性,从外部链接程序API,到模式匹配,再到用于垃圾回收的并发线程堆栈处理。
    JDK 16 将是继9月15日发布的 JDK 15 之后,一个标准的 Java 版本参考实现。拟定发布计划是在2020年12月10日和2021年1月14日分别两次进入提案冻结阶段,随后在2021年2月4日和2月18日发布两个预览版本。生产版本预计在2021年3月16日正式发布。

    纵观 JDK 史 :

    JDK 1.0
        1996-01-23 发布
    
    JDK 1.1
        1997-02-19 发布
    
    JDK 1.2
        1998-12-04 发布
    
    JDK 1.3
        2000-05-08 发布
    
    JDK 1.4
        2002-02-13 发布
        正则表达式,异常链,NIO,日志类,XML解析器,XLST 转换器
    
    JDK 1.5/5.0
        2004-09-30 发布
        自动装箱、泛型、动态注解、枚举、可变长参数、遍历循环
    
    JDK 1.6/6.0
        2006-04 提供动态语言支持、提供编译 API 和卫星 HTTP 服务器 API,改进 JVM 的锁,同步垃圾回收,类加载
    
    JDK 1.7/7.0
        2011-07-28 发布
        提供GI回收器、加强对非Java语言的调用支持(JSR-292,升级类加载架构
    
    JDK 1.8/8.0
        2014-03-18 发布
        Lambda 表达式、方法引用、默认方法、新工具、Stream API、Date Time API 、Optional 类、Nashorn, JavaScript 引擎
    
    JDK 9.0
        2017-09-21 发布
        JShell、不可变集合工厂方法、模块系统、http协议2.0版本、Process API/CompletableFuture API/Optional Class/Stream API增强、匿名内部类的钻石操作符、默认G1垃圾回收器、try语句语法改进
    
    JDK 10.0
        2018-03-21 发布
        JIT 编译器、局部变量类型引用、数据类型共享、并行GC、root 证书、javah工具、堆分配
    
    JDK 11.0
        2018-09-25 发布
        单命令运行Java文件、Lambda 参数局部变量语法、基于嵌套访问控制、动态类文件常量、误操作垃圾回收器、删除Java EE和 CORBA 模块、ChaCha20与Poly1305加密算法、Aarch64增强、ZGC试用、弃用 Nashorn JS引擎
    
    JDK 12.0
        2019-03-19 发布
        JVM 增强、Switch 表达式、文件 mismatch() 方法、String 新方法 indent()/transform()/describeConstable()/resolveConstantDesc()、JVM常量API、instanceof 模式匹配
    
    JDK 13.0
        2019-09-17 发布
        支持编写文本块、Switch 表达式增强、重构遗留的 Socket API、取消提交未使用内存、动态CDS存档、支持Unicode 12.1、DOM 和 SAX 工厂支持命名空间
    
    JDK 14.0
        2020-03-17 发布
        空指针异常增强提示、Switch 表达式(标准)、instanceof 模式匹配(预览)、Records 类(预览)、文本块(第二次预览)、打包工具(孵化)、JFR 事件流、ZGC ( 支持 macOS 和 Windows )、外部存储器访问API(孵化)
    
    JDK 15.0
        2020-09-15 发布
        密封类(预览)、instanceof 模式匹配(第二次预览)、Records 类(第二次预览)、文本块(标准)、隐藏类、删除 Nashorn JS引擎、重构遗留的 DatagramSocket API、外部存储器访问API(第二次孵化)、弃用RMI激活、移除 Solaris 和 SPARC 的端口
    
    JDK 16.0
        2020-12-10 第一次提案冻结
        2021-01-14 第二次提案冻结
        2021-02-04 发布第一个预览版本
        2021-02-18 发布第二个预览版本
        2021-03-16 正式发布
    

    在这里插入图片描述

    截至2020年12月1日,JDK 16 有 15项 正式提案,另外基于值的类警告和密封类(第二次预览)2项 仍处于 “针对目标提案” 阶段。
    Java 16 的新特性包括:

    1、基于值的类警告提议 将原始包装类指定为基于值的类,同时不推荐通过提示新弃用警告促使用户将其构造函数移除。在 Java 平台中对于任何基于值的类实例进行同步的错误尝试,会予以警告。推动这一努力的是 Valhalla 项目,该项目正在以原始类的形式对 Java 编程模型进行重大改进。原始类将实例声明为无身份的,并且可以内联或展平表示形式,其中实例可以在内存位置之间自由复制,并可以使用实例字段的值进行编码。Java 中原始类的设计和实现现在已经足够成熟,可以预见,在将来的发行版中会把 Java 平台的某些类迁移至原始类。这些计划迁移的类在API规范中将被设计成 基于值的类。

    2、之前在 JDK 15 中进行过预览,密封类 和接口限制了可以扩展或实现它们的类和接口。这项计划的目标包括:允许类或接口的创建者控制负责实现它的代码,提供比访问修饰符更声明性的方式来限制超类的使用,并通过提供模式分析基础来支持模式匹配的未来发展。

    3、默认情况下,JDK 内部结构是强封装的,而关键内部API(例如misc.Unsafe)除外。自 JDK 9 以来默认允许用户选择使用宽松的强封装。作为 Jigsaw 项目 的一部分,此提案的目标包括提高 JDK 的安全性和可维护性,并鼓励开发人员从直接使用内部元素逐渐迁移为使用标准 API,这样开发人员和最终用户都可以轻松地升级到 Java 的未来版本。该建议确实存在主要风险,即现有版本的 Java 代码将无法运行。鼓励开发人员使用 jdeps 工具来识别代码中依赖的 JDK 内部元素,并在可用时切换到 标准替代版本。开发人员可以使用现有的发行版(如JDK 11)来测试现有代码,通过使用 --illegal-access=warn 来识别通过反射访问的内部元素,使用 --illegal-access=debug 来定位错误的代码,并使用 --illegal-access=deny 来进行测试。

    4、支持静态类型的纯 Java 方式访问本地代码的 外部链接程序 API。该接口在 JDK 16 中处于孵化阶段,与被提案的外部存储访问接口一起,外部链接程序接口将会大大减少像其他方式绑定本地库容易出错的情况。这项计划目的在于通过用更高级的纯 Java 开发模式来替换 JNI(Java本机接口),以提供与C语言的交互,并随着时间的推移,它将更加灵活并适配支持其它平台(例如32位的x86架构)和其他非C语言编写的外部函数(例如C++编写的外部函数)。它的性能将会比JNI更加优越。

    5、将 ZGC(可扩展的低延迟垃圾收集器)线程堆栈处理 从安全点移至并发阶段。该计划的目标包括从ZGC安全点中删除线程堆栈处理,使堆栈处理变得懒性、协同、并发和增量,从ZGC安全点移除所有其它单一线程的 root 处理,并为其它虚拟机子系统提供了一种延迟处理堆栈的机制。ZGC旨在使 HotSpot 中的GC暂停和可伸缩性问题成为过去。到目前为止,随着堆大小和元空间大小变化而伸缩的GC操作已经从安全点操作中移除,并迁到并发阶段,它们包括标记,重定位,引用处理,类卸载和大多 root 处理。GC安全点中唯一仍保留执行的是子集root处理和限时标记终止操作。这些 root 处理包括Java线程堆栈和其它线程 root,由于它们会随线程数量而伸缩所以会存在问题。要消除这些问题,每个线程的处理(包括堆栈扫描)必须移动到并发阶段。通过这项计划,提升延迟的吞吐成本将会微不足道,并且在典型计算机上ZGC安全点内部花销的时间将会少于1毫秒。

    6、弹性元空间功能 可将未使用的 HotSpot 虚拟机类元数据(元空间)占用的内存更迅速地返回给操作系统,从而减少元空间占用并简化元空间代码以降低维护成本。元空间存在大量的堆外内存使用问题。该项计划呼吁采用内存分区分配方案来替换现有的内存分配机制,提供一种将内存划分为多个分区以满足内存请求的算法。这种方法已在许多地方使用(例如 Linux 内核等),它将使得在较小块中分配内存以减少类加载器开销的方式变得可行,碎片化也将减少。此外,从操作系统到内存管理区域,记忆内存都将被延迟、按需使用,以减少加载程序占用的空间,这些加载程序从大型区域开始占用,但又不立即使用它们或可能无法充分利用它们。为了充分利用分区分配所提供的弹性,将元空间内存排列成大小一致的颗粒,这些颗粒可以彼此独立地进行提交和不提交。

    7、启用C++ 14语言功能,以允许在 JDK C++源代码中使用 C++ 14 功能,并提供关于这些允许在 HotSpot 虚拟机代码中使用的功能的具体指南。通过JDK 15,我们知道在 JDK 中 C++代码使用的语言特性已限于 C++ 98/03语言标准。自 JDK 11,源代码就已升级为支持使用更新版本的C++标准进行构建。这包括能够使用支持 C++ 11/14语言功能的最新版本的编译器进行构建。这项提案不推荐对在 HotSpot 之外使用的C++代码样式或用法进行更改,但是要利用C++语言的特性,一些构建时的更改是必须的,这取决于平台编译器。

    8、孵化阶段的矢量API,是 JDK 中配备的一个孵化模块jdk.incubator.vector,用于表达矢量计算————编译为所支持的 CPU 架构上的最佳硬件指令。以实现优于同等标量计算的性能。矢量API提供了一种使用Java编写复杂矢量算法的机制,该机制使用 HotSpot 虚拟机中预先存在的支持连同一套用户模型进行矢量化,使其更可预测且更具健壮性。该提案的目标包括提供一个清晰简洁的API来表达一系列向量计算,通过支持多个 CPU 架构实现平台无关性,以及在 x64 和 AArch64 架构上提供可靠的运行时编译和性能。优雅降级也是一个目标,在这个目标中,如果向量计算在运行时不能完全表示为硬件向量指令序列,那么向量计算将优雅地降级,并且仍然可以正常工作,原因可能是某个架构不支持某些指令,或者是其它CPU架构不受支持。

    9、将JDK移植到 Windows/AArch64 平台。随着新的服务器级和消费类 AArch64(ARM64)硬件的发布,加上需求原因 Windows/AArch64 已经成为一个重要的平台。虽然移植本身已经基本完成,但该项提案的重点是将端口集成到主线JDK库中。

    10、在 x64 和 AArch64 架构上,将 JDK移植到 Alpine Linux 和其他使用 musl 作为其主要C库的 Linux 发行版。Musl是 ISOC 和 Posix 标准中描述的标准库功能的Linux实现。 Alpine Linux 由于镜像较小而被广泛应用于云部署、微服务和容器环境中。Linux 版本的 Docker 容器镜像小于6MB。让 Java 在这种设置中开箱即用,并允许Tomcat、Jetty、Spring和其它流行的框架在本机环境中正常工作。通过使用 jlink 来减少 Java 运行时的大小,用户可以创建一个更小的镜像,以运行特定的应用程序。

    11、[提供记录类,作为不可变数据的透明载体。记录类可以认为是名义元组。记录类在 JDK 14 和 JDK 15 中进行了预览。此做法是为了回应有关Java过于冗长拘谨的抱怨。该计划的目标包括设计一个表示简单值集合的面向对象的构造器,帮助开发人员专注于对不可变数据的建模而不是扩展行为,自动实现数据驱动的方法(例如 equals 和 accessors ),并保留长期的 Java 原则,例如名义类型。

    12、Unix-Domain 套接字通道 的添加,其中Unix-Domain(AF_UNIX)套接字支持被添加到 nio.channels 包中的套接字通道和服务器套接字通道API中。该计划还扩展了继承的通道机制,以支持Unix-Domain套接字通道和服务器套接字通道。Unix-Domain套接字用于同一主机上的进程间通信。它们在大多数方面与TCP/IP套接字类似,除了它们是通过文件系统路径名而不是IP地址和端口号寻址的。新功能的目标主要是支持Unix平台和Windows通用的Unix-Domain套接字通道的所有功能。Unix-Domain套接字通道在读取/写入行为,连接设置,服务器对传入连接的接受以及在选择器中与其他非阻塞可选通道的复用方面将与现有的TCP/IP通道相同。Unix-Domain套接字比用于本地,进程间通信的TCP/IP回送连接更安全,更高效。

    13、外部存储器访问API,允许Java程序安全地访问Java堆以外的外部存储器。外部存储器访问API,以前在JDK 14和JDK 15中都进行过孵化,未来在 JDK 16 中将再次孵化,并加以改良。改良范围包括在 MemorySegment 和 MemoryAddresses 接口之间划分更明确的角色。此项提案的目标包括提供一个可以在各种外部存储(包括本机,持久化介质以及托管堆存储器)上运行的 API。该 API 不会对虚拟机的安全性造成威胁。该项提案的动机是为了让很多 Java程序访问外部存储,像 Ignite、Memcached 以及 MapDB 。遗憾的是 Java API 还没有令人满意的访问外部存储的解决方案。

    14、在 JDK 14和 JDK 15中都已预览过 instanceof 操作符的 模式匹配,它将在JDK 16中最终确定。模式匹配使程序中的通用逻辑(即从对象中有条件地提取组件)得以更简洁、安全的表达。

    15、提供一款名为 jpackage 的工具,用于独立打包 Java 应用程序。jpackage 在 JDK 14 中被作为孵化工具引入,并在 JDK 15 中仍处于孵化阶段。到了JDK 16,jpackage 将投入生产,支持本地的软件包格式,从而为用户提供自然的安装体验,并允许在打包时指定启动时参数。支持的格式包括 Windows 上的 msi 和 exe ,MacOS 上的 pkg 和 dmg 以及 Linux 上的 deb 和 rpm 。该工具可以直接从命令行或以编程方式调用。新的打包工具解决了这样一种情况:许多Java应用程序需要以全局可用的方式安装在本机平台上,而不是简单地放置在类路径或模块路径上。因此提供适合本机平台的可安装软件包非常有必要。

    16、OpenJDK 源代码仓库从 Mercurial 迁移至 Git。推动这一努力会在几方面体现优势:版本控制系统元数据大小方面、可用工具方面以及托管方面。

    17、迁移到 GitHub,这个变化是基于 OpenJDK 源代码库从 Mercurial 迁移到 Git,JDK 16源代码仓库将出现在流行的代码共享网站上。Mercurial JDK 和 JDK-sandbox 迁移到 Git、GitHub 和 Skara 的过渡工作已于9月5日完成,现已向用户开放。

    在网站 jdk.java.net 中可以下载到适用于 Linux、Windows 和 MacOS 的 JDK 16 早期测试版本。和JDK 15一样,JDK 16也会是一个短期版本,仅支持六个月。而计划在2021年9月发布的 JDK 17 将会是一个长期支持(LTS)版本,并获得数年的支持。当前的长期支持(LTS)版本是2018年9月发布的 JDK 11。
    

    总结

    相信很多企业或个人,目前都还在使用 JDK 8 这个长期维护版本,最新一个长期维护版本是 JDK 11 ,估计使用的人群也还不是特别多,因为对于企业/个人来说,版本升级的成本太大了,往往我们更加需要的是系统能够稳定安全运作,哪怕是需要牺牲一部分性能。从 JDK8 开始,Java 语言就越显得更加具有攻击性和包容性,版本升级速度和周期也是极其惊人,如今短短几年,已是 JDK 16,所以本人特别看好 Java 在未来市场的占比和技术能力的持续延伸,加油,Java 们。
    References

    [1] JDK 16: https://www.infoworld.com/art…
    [2] JDK 15: https://www.infoworld.com/art…
    [3] 基于值的类警告提议: https://openjdk.java.net/jeps…
    [4] Valhalla 项目: https://openjdk.java.net/proj…
    [5] 基于值的类: https://docs.oracle.com/en/ja…
    [6] 密封类: https://openjdk.java.net/jeps…
    [7] JDK 内部结构是强封装的: https://openjdk.java.net/jeps…
    [8] Jigsaw 项目: https://openjdk.java.net/proj…
    [9] 标准替代版本: https://wiki.openjdk.java.net…'sinternalAPIs
    [10] 外部链接程序 API: https://openjdk.java.net/jeps…
    [11] ZGC(可扩展的低延迟垃圾收集器)线程堆栈处理: https://openjdk.java.net/jeps…
    [12] 弹性元空间功能: https://openjdk.java.net/jeps…
    [13] 启用C++ 14语言功能: https://openjdk.java.net/jeps…
    [14] C++ 14: https://www.infoworld.com/art…
    [15] 孵化阶段的矢量API: https://openjdk.java.net/jeps…
    [16] 将JDK移植到 Windows/AArch64 平台: https://openjdk.java.net/jeps…
    [17] JDK移植到 Alpine Linux : https://openjdk.java.net/jeps…
    [18] jlink: https://openjdk.java.net/jeps…
    [19] 提供记录类: https://openjdk.java.net/jeps…
    [20] Unix-Domain 套接字通道: https://openjdk.java.net/jeps…
    [21] 外部存储器访问API: https://openjdk.java.net/jeps…
    [22] 模式匹配: https://openjdk.java.net/jeps…
    [23] 提供一款名为 jpackage 的工具,用于独立打包 Java 应用程序: https://openjdk.java.net/jeps…
    [24] JDK 14: https://www.infoworld.com/art…
    [25] OpenJDK 源代码仓库从 Mercurial 迁移至 Git: https://openjdk.java.net/jeps…
    [26] 迁移到 GitHub: https://openjdk.java.net/jeps…
    [27] JDK 16源代码仓库将出现在流行的代码共享网站上: https://www.infoworld.com/art…
    [28] jdk.java.net: https://jdk.java.net/16/
    [29] JDK 11: https://www.infoworld.com/art…

    展开全文
  • JDK16 发布!

    2021-03-18 17:31:45
    JDK16已于北美时间3月16日发布,对Java开发者来说,JDK的这次更新总共带来了12个全新的特性1. 支持类型匹配的instanceofif(objinstanceofStri...

    JDK16已于北美时间3月16日发布,对Java开发者来说,JDK的这次更新总共带来了12个全新的特性

    1. 支持类型匹配的instanceof

    if (obj instanceof String) {
        String s = (String) obj;    // grr...
        ...
    }
    

    这样的类型转换在JDK16中的写法是:

    if (obj instanceof String s) {
        // Let pattern matching do the work!
        // varialble s can be used here
        ...
    }
    

    如果obj的真实类型是String,则变量s可以在if语句中使用,但是如果obj的类型不是String,则s不能用在后续的变量命名中:

    // a is not instance of Point
    if (a instanceof Point p) {
       ...
    }
    if (b instanceof Point p) {         // ERROR - p is in scope
       ...
    }
    

    2. record关键字

    对于一些POJO类,我们往往需要这样写

    class Point {
        private final int x;
        private final int y;
    
        Point(int x, int y) {
            this.x = x;
            this.y = y;
        }
    
        int x() { return x; }
        int y() { return y; }
    
        public boolean equals(Object o) {
            if (!(o instanceof Point)) return false;
            Point other = (Point) o;
            return other.x == x && other.y == y;
        }
    
        public int hashCode() {
            return Objects.hash(x, y);
        }
    
        public String toString() {
            return String.format("Point[x=%d, y=%d]", x, y);
        }
    }
    

    在引入了record关键字之后,上面的代码可以简化为:

    record Point(int x, int y) { }
    

    如果对类的属性初始化的时候有定制逻辑,也是支持的

    record Rational(int num, int denom) {
        Rational {
            int gcd = gcd(num, denom);
            num /= gcd;
            denom /= gcd;
        }
    }
    

    3.全并发的ZGC

    与CMS中的ParNew和G1类似,ZGC也采用标记-复制算法,不过ZGC对该算法做了重大改进:ZGC在标记、转移和重定位阶段几乎都是并发的,这是ZGC实现停顿时间小于10ms目标的最关键原因。

    ZGC只有三个STW阶段:初始标记,再标记,初始转移。其中,初始标记和初始转移分别都只需要扫描所有GC Roots,其处理时间和GC Roots的数量成正比,一般情况耗时非常短;再标记阶段STW时间很短,最多1ms,超过1ms则再次进入并发标记阶段。

    即,ZGC几乎所有暂停都只依赖于GC Roots集合大小,停顿时间不会随着堆的大小或者活跃对象的大小而增加。与ZGC对比,G1的转移阶段完全STW的,且停顿时间随存活对象的大小增加而增加。

    4. 可弹性伸缩的元数据区

    JDK16对元数据区切分为更小的内存块,并将不再使用的内存快速返还给操作系统,对于频繁加载和卸载类的应用来说这一优化可以产生大量的空闲内存,提升整个JVM的性能

    5. 支持Unix套接字

    在2019 Windows Server和Windows 10提供了对Unix套接字的支持,Unix套接字常用于本地进程之间通信,相比于TCP协议,本地进程使用Unix套接字可以更高效安全的通信。JDK16新增了一个适配Unix套接字的新接口java.net.UnixDomainSocketAddress用于支持这一特性

    6. 新的打包工具jpackage

    支持将Java程序打包为对应平台的可执行程序

    • linux: deb和rpm

    • mac: pkg和dmg

    • Windows: msi和exe 假如我们在lib目录下有一个jar包组成的应用,并且main.jar包含main方法,则可以使用下面的语句产生对应平台的可执行程序

    jpackage --name myapp --input lib --main-jar main.jar
    

    如果main.jar的MANIFEST.MF没有指定main函数,则需要在命令行中指定

    jpackage --name myapp --input lib --main-jar main.jar \
      --main-class myapp.Main
    

    7. 针对Value-Based类的编译器warning提示

    对于基本类型的包装类,JDK16提供了两种新的编译器warning提示

    • 包装类的构造函数在JDK9已经被废弃,如果在程序中继续使用,则编译器会报warning提示

    • 如果包装类作为关键字synchronized的参数使用,则也会收到编译器的warning提示

    • 如果接口类作为关键字synchronized的参数使用,则会收到javac编译器的warning提示 举例:

    Double d = 20.0;
    synchronized (d) { ... } // javac warning & HotSpot warning
    Object o = d;
    synchronized (o) { ... } // HotSpot warning
    

    8. 对JDK内部方法提供强制的封装

    这个更新目的是为了引导开发者放弃使用JDK内部类转为使标准的API接口,除了例如sun.misc.Unsafe这样内部关键的接口之外,其他所有内部元素都提供默认的封装。

    使用了JDK内部接口的代码再JDK16下编译会失败,JVM参数-–illegal-access能够控制这一行为,要知道从JDK9到JDK15,这个参数默认的值都是warning,而现在已经变成了deny

    9. 提供向量计算的API

    之前向量计算的API在JDK中是缺失的,常见的二方库有coltcommons-math3,这些二方库在版本老旧,在易用性上也比较差,此次JDK16引入的向量计算的API针对多数现代CPU使用的SIMD指令进行了优化,大幅提升了计算性能

    10. 对原生代码的调用提供更方便的支持

    相比于JNI,提供更方便的方法用于调用原生代码,比如我们想在Java代码中调用size_t strlen(const char *s);这个原生C函数,我们只需要这样写:

    MethodHandle strlen = CLinker.getInstance().downcallHandle(
            LibraryLookup.ofDefault().lookup("strlen"),
            MethodType.methodType(long.class, MemoryAddress.class),
            FunctionDescriptor.of(C_LONG, C_POINTER)
        );
    

    11. 提供操作外部内存的能力

    JDK16通过VarHandle这个类的实例来引用外部内存区域,如果我们想初始化一段外部的内存区域,可以这样写:

    VarHandle intHandle = MemoryHandles.varHandle(int.class,
            ByteOrder.nativeOrder());
    
    try (MemorySegment segment = MemorySegment.allocateNative(100)) {
        for (int i = 0; i < 25; i++) {
            intHandle.set(segment, i * 4, i);
        }
    }
    

    12. 提供限制可以继承此类的关键字sealedpermits

    在JDK16中,提供了一种比访问修饰符更精细的控制手段:可以指定可以继承或者实现当前类或者接口的类,这个能力是通过关键字sealedpermits实现的

    public abstract sealed class Shape 
        permits com.example.polar.Circle,
                com.example.quad.Rectangle,
                com.example.quad.simple.Square { ... }
    

    比如在上面的这个例子中,类Shape只能限定被Circle,RectangleSquare继承

    -END-
    如果看到这里,说明你喜欢这篇文章,请 转发、点赞。微信搜索「web_resource」,关注后回复「进群」或者扫描下方二维码即可进入无广告交流群。
    ↓扫描二维码进群↓
    
    推荐阅读 
    1.  一份 Spring Boot 项目搭建模板
    2.  Spring Boot 实现应用监控和报警
    3.  Nginx 从入门到实战
    4.  一键式搭建分布式文件服务器
    5.  团队开发中 Git 最佳实践
    
    喜欢文章,点个在看 
    
    展开全文
  • Linux安装JDK16

    千次阅读 2021-08-12 11:17:59
    文章目录前言一、下载JDK16二、安装JDK161. 解压JDK压缩包2. 添加jre执行文件3. 配置环境变量4. 检查是否配置成功总结 前言 坚定于选择,不吝惜地付出汗水 ,听从自己的决定,让汗水见证你成功的梦想。 在开发好...
  • 上一篇:Java 15 正式发布, 14 个新特性JDK 16 正式发布牛逼啊,JDK 15 刚发布半年(2020/09/15),JDK 16 又如期而至(2021/03/16),老铁们,跟上。来看下 Oracle Java 支持路线图:Oracle 继续保持版本半年一发的...
  • JDK 16 对 ZGC 的增强

    万次阅读 2021-03-25 00:25:32
    JDK 16 已经发布。与往常一样,新版本 JDK 会带来一系列新功能、功能增强以及 bug 修复。在这个版本中 ZGC 有 46 个功能增强以及 25 个 bug 修复。这里我会介绍一些...
  • JDK16新特性一览

    2021-03-17 19:43:53
    历史文章推荐: 啥?用了并行流还更慢了 InnoDB自增原理都搞不清楚,还怎么CRUD? Lombok的Builder注解不好用,试试SuperBuilder吧 ...JDK16已于北美时间3月16日发布,JDK的这次更新总共带来了17个全新的
  • 在2021年3月16日,JDK的迎来了它的一个新版本JDK16,虽然JDK16不是LTS版本,但是作为下一个LTS版本JDK17的先行版本,JDK16为我们带来了17个方面的提升,包括了新的语言特性、新的工具、内存管理的提升等方面。...
  • 1.4.2 安装配置jdk16 java16 环境变量配置 JAVA_HOME = D:\jdk\jdk-16.0.2 CLASSPATH = %JAVA_HOME%\lib;. 编辑path 添加 %JAVA_HOME%\bin 1.5 HelloWorld程序入门 编写HelloWorld程序,在桌面上建立一个Demo.java...
  • 当我们开发者与大多企业还停留在JDK8的时候,JDK16即将问世,你准备好了吗? 作为开发者的我与大家一样,我真心的跟不上,也跟不上jdk更新的速度,但这会影响我们吗?答案是否定的,目前主流大型企业很多停留在jdk...
  • JDK16和JDK8共存与切换

    千次阅读 2021-05-21 20:48:12
    将jdk8和jdk16分别安装在同一目录下的两个不同的文件夹中 2. 设置环境变量 此电脑右击属性 高级系统设置 高级 环境变量 在系统变量中添加JAVA_HOME变量,变量路径为刚才jdk安装的路径 在系统变量Path中增加%JAVA_...
  • 安装Java (JDK16

    万次阅读 多人点赞 2021-04-14 22:20:18
    本文将在win10的环境下安装jdk16、配置环境变量以及安装eclipse。 1.下载jdk 打开官网 [https://www.oracle.com/java/technologies/javase-downloads.html] 下载JDK(Java SE Development Kit, JDK)
  • 下载安装JDK16

    千次阅读 2021-05-20 17:58:36
    下载安装JDK16安装JDK配置环境变量测试 进入# oracle官网,点击上面横幅Products点击java 接下来会看到一个JDK download 进去就可以选择自己想要的版本号了,这里我的电脑操作系统是Window64位,(可以右击此电脑-...
  • JDK 16特性简介

    2021-05-27 07:33:32
    JDK 16新特性说明 JDK 16于2021年3月16日正式发布GA版 OpenJDK 官网对 JDK 16新特性说明的访问地址: http://openjdk.java.net/projects/jdk/16/ JDK 16新特性概览 JEP Feature 说明 338 Vector API ...
  • JDK 16 昨日正式发布,新特性实践尝鲜来啦!

    千次阅读 多人点赞 2021-03-18 00:21:28
    JDK 16在2021年2月18日已完成最终候选版本,并于2021年3月16日正式发布。和JDK 15一样,JDK 16也会是一个短期版本,仅支持六个月。而计划在2021年9月发布的JDK...
  • JDK16的新特性

    千次阅读 2021-11-11 15:03:42
    文章目录简介JDK16的新特性语言方面的提升内存管理方面的提升Unix-Domain Socket ChannelWarning For Value-based Classes封装内部的JDK包C++ 14语言特性预览语言新特性总结 简介 在2021年3月16日,JDK的迎来了它的...
  • 安装JDK(以安装JDK16为例)

    千次阅读 2021-04-03 10:48:11
    下载电脑对应的JDK(以windows64位JDK16为例) 步骤一:百度打开网址https://www.oracle.com 步骤二:创建Oracle账户 步骤三:登录Oracle 步骤四:搜索JDK download 步骤五:找到JDK16 点击JDK download 步骤六...
  • JDK1.8和JDK16环境变量配置

    千次阅读 2021-07-26 21:09:47
    变量值:D:\JAVA\JDK16(此地址为JDK安装的目录,路径最好不要有中文),然后点击确定. 再次点击新建 变量名:CLASSPATH 变量值:.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
  • windows安装java jdk16

    2021-09-07 10:34:22
    windows安装java jdk16***java jdk16 下载*** java jdk16 下载 官网地址下载 下载后直接双击安装,记住自己安装的位置 我的电脑/此电脑 右键属性-> 在关于里 相关设置 找到高级系统设置 ->打开环境变量 ->...
  • jdk 16中改进的ZGC

    千次阅读 2021-04-01 10:51:11
    jdk16之前,当重定位集非常大时转发表的分配和初始化可能会占用整个gc周期时间的很大一部分;重定位集的大小与在重定位期间移动的对象数相关;假如存在一个大于100GB的堆并且因工作负载导致大量碎片,如果这些碎片...
  • 还没看过的小伙伴点这里:Spring Boot 2.4.4、Spring Cloud 2020.0.2 发布 今天再给大家介绍下最新的Spring Framework 5.3.5 内容,支持最新的JDK16哦(JDK16更新内容:Java 16 正式发布!你还学得动吗?) Spring ...
  • 配置jdk16时没有jre目录

    千次阅读 2021-06-09 10:49:19
    下载的jdk包文件没有jre问题描述:下载的JDK压缩包或安装文件没有JRE包原因分析:解决方案: 问题描述:下载的JDK压缩包或安装文件没有JRE包 问题:在下载新的jdk时没有jre这个文件夹,在配置path这个环境变量时没...
  • jdk安装教程 随着Java功能流变得越来越流行,越来越多的请求要求支持新的流操作。... JDK 16 Early Access Build 27引入了Stream.toList() ,它是本文的主题。 在JDK 16 Early Access Build 27引入Stream.toLi...
  • 说道JDK的选择,就不得不提oracleJDK和openJDK的区别,我们一般所说的JDK指的是oracle公司发布,基于Java标准版规范实现。 OpenJDK是Java SE平台版的开源和免费实现,它是Sun Corporation(现在的Oracle Corporation...
  • linux系统下安装jdk16

    2021-07-30 22:30:55
    linux系统下安装jdk16一.查看系统是否自带了jdk二.下载JDK三.开始安装四.配置环境变量 一.查看系统是否自带了jdk 以下方法任选一种: 1.打开终端,输入: java -version 2.打开终端,输入: rpm -qa | grep java 二....
  • 日前, JDK 16 揭晓了即将到来的新功能,接下来,我们将一睹为快: 以前在 JDK 15 中预览的密封类和接口限制其他类和接口可以扩展或实现它们。该计划的目标包括,允许类或接口的作者控制负责实现它的代码,提供比...
  • JDK 16 + eclips 安装配置

    2021-04-02 09:59:48
    一、JDK16安装和配置 (1)下载地址 https://www.oracle.com/java/technologies/javase-jdk16-downloads.html 选择最后一个 Windows x64 Compressed Archive和Windows x64 Installer的区别: Windows x64 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 273,650
精华内容 109,460
关键字:

jdk16