JDK15 新特性

JDK15

339:Edwards-Curve Digital Signature Algorithm (EdDSA)
360:Sealed Classes (Preview)
371:Hidden Classes
372:Remove the Nashorn JavaScript Engine
373:Reimplement the Legacy DatagramSocket API
374:Disable and Deprecate Biased Locking
375:Pattern Matching for instanceof (Second Preview)
377:ZGC: A Scalable Low-Latency Garbage Collector
378:Text Blocks
379:Shenandoah: A Low-Pause-Time Garbage Collector
381:Remove the Solaris and SPARC Ports
383:Foreign-Memory Access API (Second Incubator)
384:Records (Second Preview)
385:Deprecate RMI Activation for Removal

JEP 339:EdDSA 数字签名算法

Edwards-Curve Digital Signature Algorithm (EdDSA)

Edwards-Curve Digital Signature Algorithm (EdDSA)实现

Example API usage:

// example: generate a key pair and sign
KeyPairGenerator kpg = KeyPairGenerator.getInstance("Ed25519");
KeyPair kp = kpg.generateKeyPair();
// algorithm is pure Ed25519
Signature sig = Signature.getInstance("Ed25519");
sig.initSign(kp.getPrivate());
sig.update(msg);
byte[] s = sig.sign();

// example: use KeyFactory to contruct a public key
KeyFactory kf = KeyFactory.getInstance("EdDSA");
boolean xOdd = ...
BigInteger y = ...
NamedParameterSpec paramSpec = new NamedParameterSpec("Ed25519");
EdECPublicKeySpec pubSpec = new EdECPublicKeySpec(paramSpec, new EdPoint(xOdd, y));
PublicKey pubKey = kf.generatePublic(pubSpec);

JEP 360:密封类(预览)

Sealed Classes (Preview)

目标

  • 允许类或接口的作者控制哪个代码负责实现它。
  • 提供比访问修饰符更具声明性的方式来限制超类的使用。
  • 通过支持对模式的详尽分析,支持模式匹配的未来方向。

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

例如,在图形库中,类的作者可能希望只有特定的类可以扩展,因为库的大部分工作都涉及以适当的方式处理每种形状。作者对 处理 的已知子类的代码的清晰度感兴趣,并且对编写代码来防御 的未知子类不感兴趣。在这种情况下,允许任意类扩展,从而继承其代码以供重用,这不是一个目标。不幸的是,Java假设代码重用始终是一个目标:如果可以扩展,那么它可以通过任意数量的类进行扩展。放宽此假设会很有帮助,这样作者就可以声明一个不为任意类扩展而开放的类层次结构。在这样一个封闭的类层次结构中,代码重用仍然是可能的,但不能超越。

package com.example.geometry;
public abstract sealed class Shape    
    permits Circle, Rectangle, Square {...}

上面的例子中,我们指定了Shape只允许被Circle, Rectangle, Square来继承。

上面的例子中并没有指定类的包名,我们可以这样写:

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

public final class Circle extends Shape {...}

public sealed class Rectangle extends Shape
    permits TransparentRectangle, FilledRectangle {...}

public final class TransparentRectangle extends Rectangle {...}

public final class FilledRectangle extends Rectangle {...}

public non-sealed class Square extends Shape {...}

这里使用了3个关键字,一个是sealed,一个是permits,一个是non-sealed;permits的这些子类要么使用final,要么使用sealed,要么使用non-sealed修饰;针对record类型,也可以使用sealed,因为record类型暗示这final

package com.example.expression;
public sealed interface Expr
    permits ConstantExpr, PlusExpr, TimesExpr, NegExpr {...}

public record ConstantExpr(int i)       implements Expr {...}

public record PlusExpr(Expr a, Expr b)  implements Expr {...}

public record TimesExpr(Expr a, Expr b) implements Expr {...}

public record NegExpr(Expr e)           implements Expr {...}

JEP 371:隐藏类

Hidden Classes

引入隐藏类,这些类不能被其他类的字节码直接使用。隐藏类旨在供在运行时生成类并通过反射间接使用它们的框架使用。隐藏类可以被定义为访问控制嵌套的成员,并且可以独立于其他类被卸载。为frameworks提供在运行时生成内部的class

如果标准 API 可以定义不可发现且生命周期有限的隐藏类,那么动态生成类的 JDK 内部和外部的框架可以改为定义隐藏类。这将提高在JVM上构建的所有语言实现的效率。例如:

  • java.lang.reflect.Proxy可以定义隐藏类来充当实现代理接口的代理类;
  • java.lang.invoke.StringConcatFactory可以生成隐藏类来保存常量串联方法;
  • java.lang.invoke.LambdaMetaFactory可以生成隐藏的嵌套类来保存访问封闭变量的 lambda 主体;和
  • JavaScript 引擎可以为从 JavaScript 程序翻译的字节码生成隐藏类,因为当引擎不再使用它们时,这些类将被卸载。

JEP 372:移除 Nashorn JavaScript 引擎

Remove the Nashorn JavaScript Engine

具体就是jdk.scripting.nashorn及jdk.scripting.nashorn.shell这两个模块被移除了

JEP 373:重新实现 Legacy DatagramSocket API

Reimplement the Legacy DatagramSocket API

将 java.net.DatagramSocket及java.net.MulticastSocket API 的基础实现替换为更简单、更现代、更易于维护和调试的实现。新的实现将很容易适应与虚拟线程一起工作,目前正在Project Loom中探索。这是JEP 353的后续版本,JEP 353已经重新实现了传统的套接字API。

JEP 374:禁用偏向锁定

Disable and Deprecate Biased Locking

在 JDK 15 之前,偏置锁定始终处于启用状态且可用。使用此 JEP,除非在命令行上设置了热点,否则在启动 HotSpot 时将不再启用偏倚锁定。-XX:+UseBiasedLocking

我们将弃用该选项以及与配置和使用偏置锁定相关的所有选项。-XX:+UseBiasedLocking

  • Product options: BiasedLockingStartupDelay, BiasedLockingBulkRebiasThreshold, BiasedLockingBulkRevokeThreshold, BiasedLockingDecayTime and UseOptoBiasInlining
  • Diagnostic options: PrintBiasedLockingStatistics and PrintPreciseBiasedLockingStatistics

JEP 375:instanceof 模式匹配(第二次预览)

Pattern Matching for instanceof (Second Preview)

instanceof的Pattern Matching在JDK15进行Second Preview

@Override 
public boolean equals(Object o) {
    return (o instanceof CaseInsensitiveString) &&
        ((CaseInsensitiveString) o).s.equalsIgnoreCase(s); 
}

@Override 
public boolean equals(Object o) {
    return (o instanceof CaseInsensitiveString cis) &&
        cis.s.equalsIgnoreCase(s); 
}

JEP 377:ZGC:一个可扩展的低延迟垃圾收集器

ZGC: A Scalable Low-Latency Garbage Collector

ZGC在JDK11被作为experimental feature引入,在JDK15变成Production,但是这并不是替换默认的GC,默认的GC仍然还是G1;

ZGC是一个重新设计的并发的垃圾回收器,可以极大的提升GC的性能。支持任意堆大小而保持稳定的低延迟(10ms以内),性能非常可观。

打开方式:使用-XX:+UseZGC命令行参数打开;

JEP 378:文本块

Text Blocks

Text Blocks首次是在JDK 13中以预览功能出现的,然后在JDK 14中又预览了一次,在JDK15转正

JEP 379:Shenandoah:低暂停时间垃圾收集器

Shenandoah: A Low-Pause-Time Garbage Collector

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

henandoah和ZGC的异同点大:

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

JEP 381:移除 Solaris 和 SPARC 端口

Remove the Solaris and SPARC Ports

如题

JEP 383:外部存储器访问 API(第二次孵化版)

Remove the Solaris and SPARC Ports

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

JEP 384:Records(第二次预览)

Remove the Solaris and SPARC Ports

Records在JDK14被作为preview引入,在JDK15处于Second Preview

JEP 385:废弃 RMI 激活机制

Deprecate RMI Activation for Removal

对于现代应用程序来说,分布式系统大部分都是基于Web的,web服务器已经解决了穿越防火墙,过滤请求,身份验证和安全性的问题,并且也提供了很多延迟加载的技术。所以在现代应用程序中,RMI Activation已经很少被使用到了。并且在各种开源的代码库中,也基本上找不到RMI Activation的使用代码了。为了减少RMI Activation的维护成本,在JDK8中,RMI Activation被置为可选的。现在在JDK15中,终于可以废弃了。

参考资料

JDK 15 (java.net)

JDK 15 Release Notes, Important Changes, and Information (oracle.com)

博客

(3) Java15的新特性 - SegmentFault 思否

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值