Java15来了!!!一文详解JDK15新特性

JDK15: JDK15新功能深度解析 主要特性 一.密封类sealed Classes: 用于限制类的使用,密封的类和接口限制其他可能继承实现他们的类或接口。 通过在类class添加关键字sealed实现,声明此类为密封类。 接着在类名后添加关键字permits,声明可以该类可以被继承的子类,如下Animal类或Dog类。 子类继承父类封装的密封类sealed,需要使用关键字final,sealed,或non-sealed进行修饰。 当使用final修饰时,与之前JDK版本所声明相同,不可在被继承,如下Cat,SmallDog,LargeDo 阅读详情

一、Java历史简谈

1995 年 5 月,Sun Microsystems 公司发布了Java,一转眼,今年是Java的25岁诞辰了。这25年间,Java已经发布和预期发布的版本如下图:

可以看到,在Java8之前,Java的版本更新基本都是两年一个新版本,而在Java9之后,也就是2017年9月,Java平台的主架构师 Mark Reinhold 发出提议,要求将Java的功能更新周期从之前的每两年一个新版本缩减到每六个月一个新版本。

Java 8 与 Java 11 为目前提供支持的LTS(长期支持)版本,2021年9月,Java17将会成为最新的LTS版;Oracle 官方表示,会在 2019 年 1 月前为商业用途中的 Java 8 长期支持,而针对非商用的更新将继续提供,直至 2020 年 12 月;此外,AdoptOpenJDK 也为 Java 8 提供免费更新。针对 Java 11 的长期支持将不再由 Oracle 提供,而是改由OpenJDK 社区的 AdoptOpenJDK 提供。

二、我们该如何学习Java新特性

在过去的这些年中,Java 在过去增强功能的推动下为用户提供了超过二十年的创新。例:

  • JDK 5:enum、泛型、自动装箱与拆箱、可变参数、增强循环等

  • JDK 6:支持脚本语言、JDBC4.0API

  • JDK 7:支持try-with-resources、switch语句块增加String支持、NIO2.0包

  • JDK 8:lambda表达式、Stream API、新的日期时间的API、方法引用、构造器引用

  • JDK 9:模块化系统、jshell

  • JDK 10:局部变量的类型推断

  • JDK 11:ZGC的引入、Epsilon GC

  • JDK 12:switch表达式、Shenandoah GC、增强G1

  • JDK 13:switch表达式引入yield、文本块

  • JDK 14:instanceof模式识别、Records、弃用Parallel Scavenge+Serial GC组合、删除CMS GC

Java8之后的新特性,估计很多人都没怎么用过。那这些新特性有哪些可以应用的场景?

Java新特性我们应该应该关注哪些点呢?笔者认为有以下三点比较重要:

角度一:语法层面
例如lambda表达式,switch,自动装箱和拆箱、enum、接口中的静态方法、默认方法、私有方法

角度二:API层面
例如Stream API、新的日期时间的API、Optional、String、集合框架

角度三:底层优化
例如JVM的优化、元空间、GC、GC的组合、GC的参数、js的执行引擎、集合底层的实现

这次发布的主要功能有:

对应中文特性:(JEP:JDK Enhancement Proposals,JDK 增强建议,也就是 JDK 的特性新增和改进提案。)

  • JEP 339:EdDSA 数字签名算法
  • JEP 360:密封类(预览)
  • JEP 371:隐藏类
  • JEP 372:移除 Nashorn JavaScript 引擎
  • JEP 373:重新实现 Legacy DatagramSocket API
  • JEP 374:禁用偏向锁定
  • JEP 375:instanceof 模式匹配(第二次预览)
  • JEP 377:ZGC:一个可扩展的低延迟垃圾收集器
  • JEP 378:文本块
  • JEP 379:Shenandoah:低暂停时间垃圾收集器
  • JEP 381:移除 Solaris 和 SPARC 端口
  • JEP 383:外部存储器访问 API(第二次孵化版)
  • JEP 384:Records(第二次预览)
  • JEP 385:废弃 RMI 激活机制

我们可以看到,Java 15为用户提供了14项主要的增强/更改,主要是对之前版本预览特性的功能做了确定,如文本块、ZGC等,包括一个孵化器模块,三个预览功能,两个不推荐使用的功能以及两个删除功能。相对于Java14的16个新特性,包含的 JEP(Java/JDK Enhancement Proposals,JDK 增强提案)比 Java 12和 13 加起来的还要多,Java15可以说是平平无奇,让人内心毫无波澜。

从上图我们还可以看到,一些features后面带有preview字样,还有一些带有incubator字样,这些即预览和孵化器模块:

➢ “孵化器模块”:将尚未定稿的API和工具先交给开发者使用,以获得反馈,并用这些反馈进一步改进Java平台的质量。

➢ “预览特性”:是规格已经成型、实现已经确定,但还未最终定稿的功能。它们出现在Java中的目的是收集在真实世界中使用后的反馈信息,促进这些功能的最终定
稿。这些特性可能会随时改变,根据反馈结果,这些特性甚至可能会被移除,但通常所有预览特性最后都会在Java中固定下来。

下面,就让我们一起来学习一下此次Java15的超实用新特性吧!

三、Java15新特性详解

在开始使用Java15新特性之前,我们应该先安装好对应的JDK和开发工具,支持Java15的开发工具官网称有以下三款:

♣ JetBrains IDEA

♣ Apache NetBeans

♣ Eclipse Marketplace

笔者常用的是idea,系统是win10,运行jdk15需要idea2020.02及以上版本才能支持,下载地址如下:

JDK15下载路径:

https://www.oracle.com/java/technologies/javase-jdk15-downloads.html

IDEA 2020.02版本下载地址:

https://www.jetbrains.com/idea/download/#section=windows

考虑到大多数人电脑中还有使用Java8的必要,以及开发过程中jdk切换的便利性,安装过程可以参考这篇文章:win10 64位系统中安装多个jdk版本的切换问题

安装完成之后,就让我们一起来看看Java15新特性的使用吧。

1、主要的6个新特性:

特性一:密封类(语法层面)

JEP 360: Sealed Classes (Preview)

通过密封的类和接口来增强 Java 编程语言,这是新的预览特性。

用于限制超类的使用,密封的类和接口限制其它可能继承或实现它们的其它类或接口。

这个特性的目标包括——允许类或接口的开发者来控制哪些代码负责实现,提供了比限制使用超类的访问修饰符声明方式更多选择,并通过支持对模式的详尽分析而支持模式匹配的未来发展。

在Java中,类层次结构通过继承实现代码的重用,父类的方法可以被许多子类继承。
但是,类层次结构的目的并不总是重用代码。有时,其目的是对域中存在的各种可能性进行建模,例如图形库支持的形状类型或金融应用程序支持的贷款类型。当以这种方式使用类层次结构时,我们可能需要限制子类集从而来简化建模。

具体使用:
因为我们引入了sealed class或interfaces,这些class或者interfaces只允许被指定的类或者interface进行扩展和实现。

使用修饰符sealed,您可以将一个类声明为密封类。密封的类使用reserved关键字permits列出可以直接扩展它的类。子类可以是最终的,非密封的或密封的。

示例:

package com.example.geometry;

abstract sealed class Shape permits Circle,Rectangle,Square{}

final class Circle    extends Shape {}

non-sealed class Rectangle extends Shape {}

sealed class Square extends Shape {}

final class TransparentRectangle extends Square{};

可以看到:

① 在声明为sealed的类Shape即为密封类,密封类必须有subclass,即子类;

② 密封类的子类可以为finall、non-sealed、sealed所修饰,如果子类也为sealed,则其也必须有子类。例如Shape的子类Square必须有子类TransparentRectangle;

③ permits修饰符是为了限制可以继承该类的所有子类,例如上述Shape类,就只能被Circle,Rectangle,Square所继承,而其他继承它的类,IDE就会直接报错;如果没有permits修饰符,例如Square类,就可以被任意类所继承。

特性二:instanceof 自动匹配模式(语法层面)

JEP 375:Pattern Matching for instanceof (Second Preview)

在Java 14中作为预览语言功能引入的instanceof模式匹配,在Java 15中处于第二次预览,而没有任何更改。

模式匹配允许程序中的通用逻辑(主要是从对象中的条件提取组件)可以更简洁地表达。Haskell 和 C# 等语言已采用模式匹配来实现简洁和安全性。

例如,我们之前对比两个对象是否同一类型,一般的写法如下:

// 新特性之前
@Test
public void test1() {
    Object o = new String("hello, java 15");
    o = new School();
    if (o instanceof String) {
        String str = (String) o; // 必须显式的声明强制类型转换
        System.out.println(str.contains("java"));
    } else {
        System.out.println("it is not string");
    }
}

而有了新特性之后,我们可以这么写:

@Test
public void test2() {
    Object o = new String("hello, java 15");
    o = new School();
    if (o instanceof String str) { // you do not need to convert type
        System.out.println(str.contains("java"));
    } else {
        System.out.println("it is not string");
    }
}

再比如,我们之前写equals方法,对比两个对象是否完全相同,现在可以这么写:

class School {
    private String student;
    private String teacher;

//新特性之前
@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (!(o instanceof School)) return false;
    School school = (School) o;
    return student.equals(school.student) && teacher.equals(school.teacher);
}
//新特新之后
public boolean equal(Object o) {
    if (this == o) return true;
    return o instanceof School school &&
            student.equals(school.student) &&
            teacher.equals(school.teacher);
}
}
特性三:文本块功能(语法层面)

JEP 378:Text Blocks

Text Blocks首次是在JDK 13中以预览功能出现的,然后在JDK 14中又预览了一次,终于在JDK 15中被确定下来,可放心使用了。

文本块是一种多行字符串文字,它避免了大多数转义序列的需要,以一种可预测的方式自动设置字符串的格式,并在需要时使开发人员可以控制格式,简化编写 Java 程序的任务。

文本块建议的目标是提高 Java 程序中的字符串的可读性,这些字符串表示以非 Java 语言编写的代码。
另一个目标是支持从字符串文本迁移,规定任何新构造都可以表达与字符串文本相同的字符串集,解释相同的转义序列,并且以与字符串文本相同的方式进行操作。OpenJDK 开发人员希望添加转义序列来管理显式空白和换行控件。

举个栗子:

package com.shenzhi.belina.entity;

import org.junit.jupiter.api.Test;

public class TextBlocksTest {

@Test
public void test1() {
    String text1 = "The Sound of silence\n" +
            "Hello darkness , my old friend\n" +
            "I 've come to talk with you again\n";

    System.out.println(text1);
    System.out.println();
    //   jdk13
    String text = """
            The Sound of silence
            Hello darkness , my old friend
            I 've come to talk with you again
            """;
    System.out.println(text);
    System.out.println(text1.length());
    System.out.println(text.length());
}

//html
@Test
public void test2(){
    String html1 = "<html lang=\"en\">\n" +
            "<head>\n" +
            "    <meta charset=\"UTF-8\">\n" +
            "    <title>java14新特性</title>\n" +
            "</head>\n" +
            "<body>\n" +
            "    <p>hello,java</p>\n" +
            "</body>\n" +
            "</html>";
    //jdk13中的新特性:
    String html2 = """
            <html lang="en">
            <head>
                <meta charset="UTF-8">
                <title>java14新特性</title>
            </head>
            <body>
                <p>hello,java</p>
            </body>
            </html>
            """;
    System.out.println(html1+html2);
}

//json
@Test
public void test3() {
    //jdk13之前的写法
    String myJson = "{\n" +
            "    \"name\":\"lihongbin\",\n" +
            "     \"address\":\"lihongbin.io\",\n" +
            "    \"email\":\"zooadmin@126.com\"\n" +
            "}";
    StringBuilder filePath = new StringBuilder();

    //jdk13的新特性
    String myJson1 = """
            {
                "name":"Lee HongBin",
                 "address":"lihongbin.io",
                "email":"zooadmin@126.com"
            }""";
    System.out.println(myJson1);
}

//sql
@Test
public void test4(){
    String sql = "SELECT id,NAME,email\n" +
            "FROM customers\n" +
            "WHERE id > 4\n" +
            "ORDER BY email DESC";
    System.out.println(sql);
    //jdk13新特性:
    String sql1 = """
            SELECT id,NAME,email
            FROM customers
            WHERE id > 4
            ORDER BY email DESC
            """;
    System.out.println();
    System.out.println(sql1);
}
//jdk14新特性
@Test
public void test5(){
    String sql1 = """
            SELECT id,NAME,email
            FROM customers
            WHERE id > 4
            ORDER BY email DESC
            """;
    System.out.println(sql1);

    // \:取消换行操作
    // \s:表示一个空格
    String sql2 = """
            SELECT id,NAME,email \
            FROM customers\s\
            WHERE id > 4 \
            ORDER BY email DESC\
            """;
    String sql3 = """
            select id,name,email \
            from customers\s\
            where id > 4\
            order by emial \s desc
            """;

    System.out.println(sql2);
    System.out.println(sql3);
    System.out.println(sql2.length());
    }
}

具体的区别,各位读者可以在运行代码后细品,不再赘述。

特性四:Records(语法层面)

JEP 384:Records Class(Second Preview)

早在2019年2月份,Java 语言架构师 Brian Goetz,曾经写过一篇文章,详尽的说明了并吐槽了Java语言,他和很多程序员一样抱怨“Java太啰嗦”或有太多的“繁文缛节”,他提到:开发人员想要创建纯数据载体类(plain data carriers)通常都必须编写大量低价值、重复的、容易出错的代码。如:构造函数、getter/setter、equals()、hashCode()以及toString()等。以至于很多人选择使用IDE的功能来自动生成这些代码。还有一些开发会选择使用一些第三方类库,如Lombok等来生成这些方法,从而会导致了令人吃惊的表现(surprisingbehavior)和糟糕的可调试性(poor debuggability)。

使用record来减少类声明语法,效果类似 lombok 的 @Data 注解,Kotlin中的dataclass。它们的共同点是类的部分或全部状态可以直接在类头中描述,并且这个类中只包含了纯数据而已。该预览特性提供了一种更为紧凑的语法来声明类。值得一提的是,该特性可以大幅减少定义类似数据类型时所需的样板代码。

Records Class 也是第二次出现的预览功能,它在 JDK 14 中也出现过一次了,使用 Record 可以更方便的创建一个常量类,使用的前后代码对比如下:

    //使用record后
    public record Customer(String name, Customer partner) {}

    //使用record前
    class Customer {
        private final String name;
        private final Customer partner;

    public Customer(String name, Customer partner) {
        this.name = name;
        this.partner = partner;
    }

    public String getName() {
        return name;
    }

    public Customer getPartner() {
        return partner;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Customer)) return false;
        Customer customer = (Customer) o;
        return Objects.equals(name, customer.name) && Objects.equals(partner, customer.partner);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, partner);
    }

    @Override
    public String toString() {
        return "Customer1{" +
                "name='" + name + '\'' +
                ", partner=" + partner +
                '}';
    }
}

当你用record 声明一个类时,该类将自动拥有以下功能:

➢ 获取成员变量的简单方法。以上面代码为例 name() 和 partner() ,我们可以通过运行下面的测试类来看看,注意区别于我们平常getter的写法。

➢ 一个 equals 方法的实现,执行比较时会比较该类的所有成员属性

➢ 重写 equals 也重写了 hashCode

➢ 一个可以打印该类所有成员属性的 toString 方法。

➢ 请注意只会有一个构造方法。

测试类如下:

package com.shenzhi.belina.lambda;

import ch.qos.logback.core.net.SyslogOutputStream;
import com.shenzhi.belina.entity.Customer;

import java.util.HashSet;

public class CustomerTest {

    public static void main(String[] args) {

        Customer customer = new Customer("conan", new Customer("chan", null));
        System.out.println(customer.toString());
        System.out.println(customer.name()); // 类似于原有的实例变量的get方法

        HashSet set = new HashSet<>(); // 验证是否重写了equals方法
        Customer customer1 = new Customer("conan", new Customer("chan", null));
        set.add(customer);
        set.add(customer1);
        set.forEach(System.out::println);

    }
}

通过运行上面的测试类,我们就可以看到上述总结的知识点了,不再赘述。

和枚举类型一样,record也是类的一种受限形式。作为回报,记录对象在简洁性方面提供了显著的好处。

➢ 我们还可以在Record声明的类中定义静态字段、静态方法、构造器或实例方法。

➢ 不能在Record声明的类中定义实例字段;类不能声明为abstract;不能声明显式的父类等。

package com.shenzhi.belina.entity;

public record Customer(String name, Customer partner) { // 小括号内定义成员变量

//  还可以声明构造器,静态的变量、方法、实例方法
    public Customer(String name){
        this(name,null);
    }

public static String info;

public void show(){
    System.out.println("i am a singer , my name is "+ name());
}

public  static  void  shown(){
    System.out.println("my name is belina");
}

//不可以在record中定义实例变量
//public int id;

private static Person person;

public static int id;


}

//record不可以声明为abstract;
//abstract record Employee(){}

//不可以显示的继承于其他类,因为本身已经继承于record
//record Employee() extends Thread{}
特性五:隐藏类(底层优化)

JEP 371:Hidden Classes

该提案通过启用标准 API 来定义无法发现且具有有限生命周期的隐藏类,从而提高 JVM 上所有语言的效率。JDK内部和外部的框架将能够动态生成类,而这些类可以定义隐藏类。通常来说基于JVM的很多语言都有动态生成类的机制,这样可以提高语言的灵活性和效率。
隐藏类天生为框架设计的,在运行时生成内部的class。
隐藏类只能通过反射访问,不能直接被其他类的字节码访问。
隐藏类可以独立于其他类加载、卸载,这可以减少框架的内存占用。

Hidden Classes是什么呢?

Hidden Classes就是不能直接被其他class的二进制代码使用的class。Hidden Classes主要被一些框架用来生成运行时类,但是这些类不是被用来直接使用的,而是通过反射机制来调用。
比如在JDK8中引入的lambda表达式,JVM并不会在编译的时候将lambda表达式转换成为专门的类,而是在运行时将相应的字节码动态生成相应的类对象。
另外使用动态代理也可以为某些类生成新的动态类。

那么我们希望这些动态生成的类需要具有什么特性呢?

不可发现性

因为我们是为某些静态的类动态生成的动态类,所以我们希望把这个动态生成的类看做是静态类的一部分。所以我们不希望除了该静态类之外的其他机制发现。

访问控制

我们希望在访问控制静态类的同时,也能控制到动态生成的类。

生命周期

动态生成类的生命周期一般都比较短,我们并不需要将其保存和静态类的生命周期一致。

API的支持

所以我们需要一些API来定义无法发现的且具有有限生命周期的隐藏类。这将提高所有基于JVM的语言实现的效率。
比如:

  • java.lang.reflect.Proxy可以定义隐藏类作为实现代理接口的代理类。
  • java.lang.invoke.StringConcatFactory可以生成隐藏类来保存常量连接方法;
  • java.lang.invoke.LambdaMetaFactory可以生成隐藏的nestmate类,以容纳访问封闭变量的lambda主体;

普通类是通过调用ClassLoader::defineClass创建的,而隐藏类是通过调用Lookup::defineHiddenClass创建的。这使JVM从提供的字节中派生一个隐藏类,链接该隐藏类,并返回提供对隐藏类的反射访问的查找对象。调用程序可以通过返回的查找对象来获取隐藏类的Class对象。

特性六:ZGC(底层优化)

JEP 377:ZGC: A Scalable Low-Latency Garbage Collector (Production)

ZGC是Java 11引入的新的垃圾收集器(JDK9以后默认的垃圾回收器是G1),经过了多个实验阶段,自此终于成为正式特性。
自 2018 年以来,ZGC 已增加了许多改进,从并发类卸载、取消使用未使用的内存、对类数据共享的支持到改进的 NUMA 感知。此外,最大堆大小从 4 TB 增加到 16 TB。支持的平台包括 Linux、Windows 和 MacOS。

ZGC是一个重新设计的并发的垃圾回收器,通过减少 GC 停顿时间来提高性能。

但是这并不是替换默认的GC,默认的GC仍然还是G1;之前需要通过-XX:+UnlockExperimentalVMOptions -XX:+UseZGC来启用ZGC,现在只需要-XX:+UseZGC就可以。相信不久的将来它必将成为默认的垃圾回收器。

相关的参数有ZAllocationSpikeTolerance、ZCollectionInterval、ZFragmentationLimit、ZMarkStackSpaceLimit、ZProactive、ZUncommit、ZUncommitDelay ZGC-specific JFR events(ZAllocationStall、ZPageAllocation、ZPageCacheFlush、ZRelocationSet、ZRelocationSetGroup、ZUncommit)也从experimental变为product

2、次要新特性

特性一:EdDSA 数字签名算法(API层面)

JEP 339:Edwards-Curve Digital Signature Algorithm(EdDSA 数字签名算法)

这是一个新的功能。
新加入基于Edwards-Curve数字签名算法(EdDSA-Edwards-Curve Digital Signature Algorithm)的加密签名,即爱德华兹曲线数字签名算法。

在许多其它加密库(如 OpenSSL 和 BoringSSL)中得到支持。

与 JDK 中的现有签名方案相比,EdDSA 具有更高的安全性和性能,因此备受关注。它已经在OpenSSL和BoringSSL等加密库中得到支持,在区块链领域用的比较多。

EdDSA是一种现代的椭圆曲线方案,具有JDK中现有签名方案的优点。EdDSA将只在SunEC提供商中实现。

特性二:重新实现 DatagramSocket API(API层面)

JEP 373:Reimplement the Legacy DatagramSocket API(重新实现 DatagramSocket API)

新的计划是JEP 353的后续,该方案重新实现了遗留的套接字API。

java.net.datagram.Socket和java.net.MulticastSocket的当前实现可以追溯到JDK 1.0,那时IPv6还在开发中。因此,当前的多播套接字实现尝试调和IPv4和IPv6难以维护的方式。

通过替换 java.net.datagram 的基础实现,重新实现旧版 DatagramSocket API。

更改java.net.DatagramSocket 和 java.net.MulticastSocket 为更加简单、现代化的底层实现。提高了 JDK 的可维护性和稳定性。

通过将java.net.datagram.Socket和java.net.MulticastSocket API的底层实现替换为更简单、更现代的实现来重新实现遗留的DatagramSocket API。

新的实现:1.易于调试和维护;2.与Project Loom中正在探索的虚拟线程协同。

特性三:禁用偏向锁定(底层优化)

JEP 374: Disable and Deprecate Biased Locking 禁用偏向锁定

在默认情况下禁用偏向锁定,并弃用所有相关命令行选项。目标是确定是否需要继续支持偏置锁定的高维护成本的遗留同步优化,HotSpot虚拟机使用该优化来减少非竞争锁定的开销。尽管某些Java应用程序在禁用偏向锁后可能会出现性能下降,但偏向锁的性能提高通常不像以前那么明显。

该特性默认禁用了biased locking(-XX:+UseBiasedLocking),并且废弃了所有相关的命令行选型(BiasedLockingStartupDelay, BiasedLockingBulkRebiasThreshold, BiasedLockingBulkRevokeThreshold, BiasedLockingDecayTime, UseOptoBiasInlining, PrintBiasedLockingStatistics and PrintPreciseBiasedLockingStatistics)

特性四:Shenandoah 垃圾回收算法(底层优化)

Shenandoah垃圾回收算法终于从实验特性转变为产品特性,这是一个从 JDK 12 引入的回收算法,该算法通过与正在运行的 Java 线程同时进行疏散工作来减少 GC 暂停时间。Shenandoah 的暂停时间与堆大小无关,无论堆栈是 200 MB 还是 200 GB,都具有相同的一致暂停时间。

怎么形容Shenandoah和ZGC的关系呢?异同点大概如下:

  • 相同点:性能几乎可认为是相同的
  • 不同点:ZGC是Oracle JDK的,根正苗红。而Shenandoah只存在于OpenJDK中,因此使用时需注意你的JDK版本

打开方式:使用-XX:+UseShenandoahGC命令行参数打开。

Shenandoah在JDK12被作为experimental引入,在JDK15变为Production;之前需要通过-XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC来启用,现在只需要-XX:+UseShenandoahGC即可启用

特性五:外部存储器访问 API(API层面)

JEP 383:Foreign-Memory Access API (Second Incubator) 外部存储器访问 API(孵化器版)

目的是引入一个 API,以允许 Java 程序安全、有效地访问 Java 堆之外的外部存储器。如本机、持久和托管堆。

有许多Java程序是访问外部内存的,比如Ignite和MapDB。该API将有助于避免与垃圾收集相关的成本以及与跨进程共享内存以及通过将文件映射到内存来序列化和反序列化内存内容相关的不可预测性。该Java API目前没有为访问外部内存提供令人满意的解决方案。但是在新的提议中,API不应该破坏JVM的安全性。

Foreign-Memory Access API在JDK14被作为incubating API引入,在JDK15处于Second Incubator,提供了改进。

特性六:移除 Solaris 和 SPARC 端口

JEP 381:Remove the Solaris and SPARC Ports (移除 Solaris 和 SPARC 端口)
删除对Solaris/SPARC、Solaris/x64和Linux/SPARC端口的源代码和构建支持,在JDK 14中被标记为废弃,在JDK15版本正式移除。

许多正在开发的项目和功能(如Valhalla、Loom和Panama)需要进行重大更改以适应CPU架构和操作系统特定代码。

近年来,Solaris 和 SPARC 都已被 Linux 操作系统和英特尔处理器取代。放弃对 Solaris 和 SPARC 端口的支持将使 OpenJDK 社区的贡献者能够加速开发新功能,从而推动平台向前发展。

特性七:移除the Nashorn JS引擎

JEP 372:Remove the Nashorn JavaScript Engine

Nashorn是在JDK提出的脚本执行引擎,该功能是 2014 年 3 月发布的 JDK 8 的新特性。在JDK11就已经把它标记为废弃了,JDK15完全移除。

在JDK11中取以代之的是GraalVM。GraalVM是一个运行时平台,它支持Java和其他基于Java字节码的语言,但也支持其他语言,如JavaScript,Ruby,Python或LLVM。性能是Nashorn的2倍以上。

JDK15移除了Nashorn JavaScript Engine及jjs 命令行工具。具体就是jdk.scripting.nashorn及jdk.scripting.nashorn.shell这两个模块被移除了。

补充:

Graal VM在HotSpot VM基础上增强而成的跨语言全栈虚拟机,可以作为“任何语言”的运行平台使用。语言包括:Java、Scala、Groovy、Kotlin;C、C++、JavaScript、Ruby、Python、R等

特性八:废弃RMI 激活机制

JEP 385:Deprecate RMI Activation for Removal

RMI Activation被标记为Deprecate,将会在未来的版本中删除。RMI激活机制是RMI中一个过时的部分,自Java 8以来一直是可选的而非必选项。RMI激活机制增加了持续的维护负担。RMI的其他部分暂时不会被弃用。

在RMI系统中,我们使用延迟激活。延迟激活将激活对象推迟到客户第一次使用(即第一次方法调用)之前。

既然RMI Activation这么好用,为什么要废弃呢?

因为对于现代应用程序来说,分布式系统大部分都是基于Web的,web服务器已经解决了穿越防火墙,过滤请求,身份验证和安全性的问题,并且也提供了很多延迟加载的技术。

所以在现代应用程序中,RMI Activation已经很少被使用到了。并且在各种开源的代码库中,也基本上找不到RMI Activation的使用代码了。

为了减少RMI Activation的维护成本,在JDK8中,RMI Activation被置为可选的。现在在JDK15中,终于可以废弃了。

3、次次要新特性

一:添加项

  • Support for Unicode 13.0 (JDK-8239383)
  • 升级了Unicode,支持Unicode 13.0
  • Added isEmpty Default Method to CharSequence (JDK-8215401)
  • 给CharSequence新增了isEmpty方法 java.base/java/lang/CharSequence.java

  • Specialized Implementations of TreeMap Methods (JDK-8176894)

  • JDK15对TreeMap提供了putIfAbsent, computeIfAbsent, computeIfPresent, compute, merge方法提供了overriding实现

  • New Option Added to jcmd for Writing a gzipped Heap Dump (JDK-8237354)

  • jcmd的GC.heap_dump命令现在支持gz选型,以dump出gzip压缩版的heap;compression level从1(fastest)到9(slowest, but best compression),默认为1

  • Added Support for SO_INCOMING_NAPI_ID Support (JDK-8243099)

  • jdk.net.ExtendedSocketOptions新增了SO_INCOMING_NAPI_ID选型

  • New System Properties to Configure the TLS Signature Schemes (JDK-8242141)

  • 新增了jdk.tls.client.SignatureSchemes及jdk.tls.server.SignatureSchemes用于配置TLS Signature Schemes

  • Support for certificate_authorities Extension (JDK-8206925)

  • 支持certificate_authorities的扩展

二:移除项&废弃项

移除项

  • Obsolete -XX:UseAdaptiveGCBoundary (JDK-8228991)
  • 淘汰了-XX:UseAdaptiveGCBoundary

废弃项

  • Deprecated -XX:ForceNUMA Option (JDK-8243628)
  • 废弃了ForceNUMA选项
  • Disable Native SunEC Implementation by Default (JDK-8237219)
  • 默认禁用了Native SunEC Implementation

三:其他事项

已知问题

  • java.net.HttpClient Does Not Override Protocols Specified in SSLContext Default Parameters (JDK-8239594)
  • HttpClient现在没有覆盖在SSLContext Default Parameters中指定的Protocols

其他事项

  • DatagramPacket.getPort() Returns 0 When the Port Is Not Set (JDK-8237890)
  • 当DatagramPacket没有设置port的时候,其getPort方法返回0
  • Improved Ergonomics for G1 Heap Region Size (JDK-8241670)
  • 优化了默认G1 Heap Region Size的计算

4、下期预告和参考文献

这篇文章从动笔到结束整整花了两个星期,絮絮叨叨给大家讲了这么多,喜欢你们能喜欢;接下来预计会再用两篇文章,来详细讲讲Java8到Java14的新特性,欢迎收藏、关注、转发、点赞、评论哟,下期再见,比心!!!

由于笔者才疏学浅,创号伊始,思虑不足,又限于资料来源有限,如有纰漏之处,敬请指正、补充!

参考资料链接:

OpenJDK

Java15新特性详解

Java版本历史

Java15新特性一览 作者:Java技术栈 JDK 15 2020/09/15 如期而至! 这个时间牛逼啊,和苹果发布会同天? OracleJDK 15 发布地址: https://www.oracle.com/java/technologies/javase/15all-relnotes.html OpenJDK 15 发布地址: https://openjdk.java.net/projects/jdk/15/ OracleJDK 和 OpenJDK 两者的区别这里不撰述了,不清楚的请点击这里进行查 阅读详情

相关推荐

一文总结Java\JDK 17发布的新特性

简介:JDK 17已经于2021年3月16日如期发布。本文介绍JDK 17新特性。JDK 17于2021年9月14日正式发布(General-Availability Release)。JDK 17将是大多数供应商的长期支持(LMS)版本。上一个LTS版本是JDK 11。 本文总结了JDK 17发布的新特性。 发布版本说明 根据发布的规划,这次发布的 JDK 17 将是一个长期支持版(LTS 版)。LTS 版每 3 年发布一个,上一次长期支持版是 18 年 9 月发布的 JDK 11。 JDK 17.

阿里云云栖号 2413

JDK15安装配置

jdk15安装配置保姆级,其他版本类似

weixin_44101554的博客 1439

【Java基础知识 15】Java控制流程语句

Java控制流相关的关键字包括ifelse、while、do-while、for、return、break、Switch。

学Java,找哪吒 1万+

JDK 15安装及新特性介绍

JDK 15已经于2020年9月15日如期发布。本文介绍JDK 15新特性。 发布版本说明 根据发布的规划,这次发布的 JDK 15 将是一个短期的过度版,只会被 Oracle 支持(维护)6 个月,直到明年 3 月的 JDK 16 发布此版本将停止维护。而 Oracle 下一个长期支持版(LTS 版)会在明年的 9 月份候发布(Java 17),LTS 版每 3 年发布一个,上一次长期支持版是 18 年 9 月发布的 JDK 11。 下图展示了各个版本的发布历史。 [外链图片转存失败,源站可能有防盗链机制

老卫的技术站 2637

java技术专家 【JDK各个版本特性讲解】JDK15特性

2020年9月15日,java15正式发布,(风平浪静的一个版本)共有14个JEP,是时间驱动形式发布的第六个版本.相关文档: https://openjdk.java.net/projects/jdk/15/通过密封的类和接口来增强Java编程语言,这是新的预览特性,用于限制超类的使用密封的类和接口限制其他可继承或者实现他们的其他类或接口.允许类或接口的开发者来控制那些代码负责实现,提供了比限制使用超类的访问修饰符声明方式更多选择,并通过支持对模式的详尽分析而支持模式匹配的未来发展在java中,类层次构造

大壮 1014

KF-gins输出结果绘图

KF-gins输出结果绘图

m0_51977577的博客 1107

Java程序员必备基础:JDK 5-15都有哪些经典新特性

前言 JDK 15发布啦~ 我们一起回顾JDK 5-15 的新特性吧,大家一起学习哈~ 本文已经收录到github https://github.com/whx123/JavaHome 公众号:捡田螺的小男孩 Java 5 新特性 1. 泛型 泛型本质是参数化类型,解决不确定具体对象类型的问题。 List<String> strList=new ArrayList<String>(); 2. 增强循环(for-each) for-each循环简化了集合的遍历。 String

weiwenhou的博客 3585

手把手教你获取全国街道级GeoJSON数据:前端地图开发必备技巧

本文详细介绍了获取全国街道级GeoJSON数据的多种方法,从前端地图开发的实际需求出发,涵盖了免费获取省市县级数据的工具如阿里云DataV.GeoAtlas和HashTang,以及进阶的街道级数据获取方案,包括使用Bigemap GIS Office和专业数据采购。文章还提供了数据处理与优化技巧,帮助开发者高效使用GeoJSON数据进行地图可视化。

weixin_29053383的博客 289

JDK 15安装及新特性介绍_jdk15

文本块最早准备在 JDK 12 添加的,但最终撤消了,然后在 JDK 13 中作为预览特性进行了添加,然后又在 JDK 14 中再次预览,在 JDK 15 中,文本块终于转正,暂不再做进一步的更改。Records Class 也是第二次出现的预览功能,它在 JDK 14 中也出现过一次了,使用 Record 可以更方便的创建一个常量类,使用的前后代码对比如下。JDK 15 为用户提供了14项主要的增强/更改,包括一个孵化器模块,三个预览功能,两个不推荐使用的功能以及两个删除功能。

2401_87298546的博客 1648

8-bit量化在YOLOv11中的部署实践-(使用PTQ、QAT量化技术实现模型体积压缩和推理加速)

本文系统介绍了YOLOv11模型量化技术,主要包括三个核心部分:首先阐述模型量化的基础理论,包括量化分类、数学原理和性能影响;其次分析YOLOv11架构特点及其量化敏感层;最后详细讲解训练后量化(PTQ)的具体实现流程。研究表明,8-bit量化可使YOLOv11模型大小缩减至1/4,推理速度提升1.7-2.3倍,精度损失控制在1%以内。文章特别强调了校准算法选择(如最小最大值法和KL散度法)对量化效果的关键影响,并提供了完整的代码实现示例,为YOLOv11的高效部署提供实用指导。

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 1625

【QGIS】软件下载安装及GIS4WRF插件使用

【QGIS】软件下载安装及GIS4WRF插件使用

WW、forever的博客 1799

JDK 15 JAVA 15的新特性展望

伴随着2020的寒冬和新冠病毒的肆虐,JAVA迎来了久未已久的JAVA 14。自从2017年JAVA 9发布之后,JAVA的发布版本跟上了敏捷开发的步伐,小步快跑,Java平台发布节奏已从每3年以上的主要版本转变为每6个月发布一次功能。现在,每年的3月和9月都会发布新的版本功能。 三月已过,九月还远吗? 在JAVA 14中,推出了swith的最终版本,并且支持了NVM。 今天本文将会展望一下JAVA 15中会带给我们的新特性

程序那些事 1万+

【Prometheus】prometheus结合cAdvisor监控docker容器运行状态,并且实现实时告警通知

Docker的监控,可以使用Docker自带的stats命令来获取当前主机上运行中的容器的资源使用情况。 例如:容器的CPU使用率、内存占用、网络IO以及磁盘IO等指标。

景天科技苑 6万+

JDK15真的来了,一起来看看它的新特性

一年两次的JDK最新版本JDK15在2020年9月15日正式发布了,这次的JDK15给我们带了隐藏类,EdDSA,模式匹配,Records,封闭类和Text Block等诸多新特性。

程序那些事 2万+

药物对接仿真软件:HADDOCK_(9).结果分析方法

HADDOCK是一种强大的药物对接仿真工具,通过对生成的输出文件进行详细的分析,我们可以验证仿真结果的可靠性,并为进一步优化药物设计提供依据。常见的分析方法包括解读输出文件、使用可视化工具进行结构分析、评估对接模型的稳定性和准确性等。通过这些步骤,我们可以更全面地了解受体和配体的结合模式,从而提高药物设计的成功率。

kkchenjj的博客 1006

AI应用工程师面试指南与参考答案

摘要:AnkerAI应用工程师职位面向2024/25届毕业生,要求计算机相关专业背景,强调工程实现与技术探索能力。岗位职责包括全栈开发、AI技术整合(如大模型、图像识别)、团队AI赋能及系统优化。职位更看重编程实践能力(Python/Java等)和学习潜力,而非单纯算法知识。成功候选人将参与智能化产品开发,获得导师指导和技术成长机会。面试准备应聚焦项目经验展示、业务需求理解和技术解决方案能力,通过结构化回答和实操案例体现工程思维与创新潜力。

郑伟强dev的专栏 407

JDK15新特性概述

Java的现状 2020 年是 Java 诞生的第 25 个年头。Oracle表示,目前java仍然流行编程语言,广泛使用在企业中。目前全世界有超过69%的专职开发人员使用Java,全世界有510亿台活动Java虚拟机(JVM)在部署中,目前Java主要被用于分析,数据管理,大数据,DevOps,移动,持续开发工具和聊天机器人等服务。 历史版本的主要新特性 在过去的这些年中,Java ...

qq_29860591的博客 3583

【CAN总线测试】——使用VH6501 进行Busoff快慢恢复测试

即在IDBase中填标准帧11位二进制ID,如果不满11位,高位补零,凑齐11位,并将下方CurrTriggerField设置干扰前一位AckSlot位,Triggeroffset设置为0。首先确认环境支持VN6501,6501硬件连接成功后,工程的小闪电是正常黄色状态,若是灰色证明缺少License,或者软件安装环境不正确。填写干扰报文ID、干扰位置 注意这里的干扰位置是实际干扰的前一位,TriggerOffset表示偏移量,可以干扰某个字节的具体位.找到并打开Panel后,开启工程,并且配置面板。

LOVE135149的博客 5629

【方向盘】JDK15正式发布,划时代的ZGC同时宣布转正

你发任你发,我用Java8。

架构师:通透,才能写出好代码! 2万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

JDK15新特性

JDK15新特性

蓝影铁哥的博客 1793

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

JDK 15 新特性

2020-9-15 当天,Oracle 宣布 Java/JDK15 正式发布。这是 Java 迭代周期缩短为六个月以后的第六个版本。随着迭代速度的加快,让 Java 的设计、开发、测试人员能够更加轻松的面对迭代中的变化。这些年发布的版本对应的 JEPS 数量如下图所示:发布版本说明根据发布的规划,这次发布的 JDK 15 将是一个短期的过度版,只会被 Oracle 支持(维护)6 个月,直到明年 3 月的 JDK 16 发布此版本将停止维护。

CoderChronicle的博客 2640

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

各个版本jdk新特性

各个版本jdk新特性

wrxfxdd的博客 3348

我还在生产玩 JDK7,JDK 15 却要来了!|新特性尝鲜

自从 JDK9 之后,每年 3 月与 9 月 JDK 都会发布一个新的版本,而2020 年 9 月即将引来 JDK15。 恰巧 IDEA 每四五个月会升级一个较大的版本,每次升级之后都会支持最新版本 JDK 引入的新功能。 这几天升级了 IDEA,顺便体验了一下 JDK15 的新特性。 虽然我知道你们可能跟我一样JDK8 都还没用熟,但是无妨,看看新版本 JDK 来酸一下。 Text Blocks 最终定板 之前版本的 JDK,如果我们需要插入 HTML,XML,SQL 或 JSON 片段,非常麻烦,需.

楼下小黑哥 2186

JDK17新特性(JDK8到JDK17的新特性)

比如对java的gui不满意,可以自己实现一个gui,对java的语法不满意,可以把javac替换成其他语言和其他语言的编译器,比如kotlin和kotlinc等,没有模块化,几乎很难实现,每次修改某个模块,总不能把整个jdk给重新编译一遍,再发布一个整个sdk吧,模块化可以帮助更有效的定制化和部署。

sv 1335
上一篇: spring cloud整合feign和nacos报错:No Feign Client for loadBalancing defined. Did you forget to include
下一篇: idea中好用的git shelve changes和stash changes
codu4u1314
博客等级 码龄7年 29粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值