Java15新特性
Java15在2020年9月15号正式发布。该版本主要带来了ZGC增强,instanceof增强,Shenandoah回收器等方面改动、增强和新特性。
Edwards-Curve 数字签名算法
- Java15引入了Edwards-Curve(EdDSA)数据签名算法,EdDAS具有更好的性能和更高的安全性。
- EdDSA已经在一些加密库中有相关实现和支持,如:OpenSSL BoringSSL等
public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeySpecException, InvalidKeyException, SignatureException { KeyFactory kf = KeyFactory.getInstance("EdDSA"); boolean xOdd = true; BigInteger y = new BigInteger("12"); NamedParameterSpec paramSpec = new NamedParameterSpec("Ed25519"); EdECPublicKeySpec pubSpec = new EdECPublicKeySpec(paramSpec, new EdECPoint(xOdd, y)); PublicKey pubKey = kf.generatePublic(pubSpec); System.out.println(pubKey); }
封闭类(预览)
- 封闭类和接口主要限制能被哪些类扩展或实现,增加开发人员对定义的类或接口进行管控,实现该类需要得到定义者允许
- 封闭类及被其以内需的子类同属一模块,并且如果声明在未命名的模块中,则需要属于同一包
- 每个被其允许的子类都需要直接扩展密封的类
- 每个被其允许的子类都需要选择一个修饰符来描述其使如何集成自父类发起的密封性
禁用、弃用偏向锁
- Java15 开始禁用、弃用了一直以来的偏向锁。
- 偏向锁假定只有第一个申请锁的线程使用锁(后面其他的线程不会再来申请锁),因此,只需要在 Mark Word 中 CAS 记录 owner(本质上也是更新,只是初始值为空),如果记录成功,则偏向锁获取成功,记录锁状态为偏向锁,当前线程等于 owner 就可以零成本的直接获得锁;否则,说明有其他线程竞争,将偏向锁撤销,上升为轻量级锁。
Record类型(预览)
ZGC(正式版)
ZGC在Java11中引入,在随后的几个版本当中持续迭代改进。在Java15当中只需要使用
-XX:+UseZGC
开启ZGC。相比Java14 不再需要使用参数
-XX:+UnlockExperimentalVMOptions
文本块(正式版)
自Java13引入了文本块 解决多行的问题,Java14 优化 增加\和\s的符号区分 在Java15中 对文本框改进如下
- stripIndent()用于从文本块去除空白字符
- translateEscapes() 用于翻译转义字符
- formatted()用于格式化
Shenandoah:一种低停顿的垃圾回收器(正式版本)
-XX:+UseShenandoahGC 开启 不需要添加参数 -XX:+UnlockExperimentalVMOptions
Shenandoah 回收器的主要有下面九个工作阶段:
Init Mark 并发标记的初始化阶段,它为并发标记准备堆和应用线程,然后扫描根节点集合。这是整个回收器工作生命周期第一次停顿,这个阶段主要工作是根节点集合扫描,所以停顿时间主要取决于根节点集合的大小。
Concurrent Marking 并发标记阶段,贯穿整个堆,以根节点集合为起点,跟踪可达的所有对象。这个阶段和应用程序一起运行,即并发(concurrent)。这个阶段的持续时间主要取决于存活对象的数量,以及堆中对象图的结构。在这个阶段,应用依然可以分配新的数据,所以在并发标记阶段,堆内存使用率会上升。
Final Mark 标记阶段,清空所有待处理的标记/更新队列,重新扫描根节点集合,结束并发标记。这个阶段还会搞明白需要被清理(evacuated)的区域(即垃圾收集集合),并且通常为下一阶段做准备。最终标记是整个内存回收周期的第二个停顿阶段,这个阶段的部分工作能在并发预清理阶段完成,这个阶段最耗时的还是清空队列和扫描根节点集合。
Concurrent Cleanup 并发回收阶段,回收垃圾区域,这些区域是指并发标记后,探测不到任何存活的对象的区域。
Concurrent Evacuation 并发整理阶段,从垃圾回收集合中拷贝存活的对象到其他的区域中,这里是 Shenandoah 垃圾回收器有别于其他内存回收器关键点。这个阶段能和应用程序一起运行,所以应用程序依然可以继续分配内存,这个阶段持续时间主要取决于选中的垃圾收集集合大小(比如整个堆划分 128 个区域,如果有 16 个区域被选中,其耗时肯定超过 8 个区域被选中)。
Init Update Refs 初始化更新引用阶段,它除了确保所有内存回收线程和应用线程已经完成并发整理阶段,以及为下一阶段内存回收做准备以外,其他什么都没有做。这是整个内存回收周期中,第三次停顿,也是时间最短的一次。
Concurrent Update References 并发更新引用阶段,再次遍历整个堆,更新那些在并发整理阶段被移动的对象的引用。这也是有别于其他 GC 特性之处,这个阶段持续时间主要取决于堆中对象的数量,和对象图结构无关,因为这个过程是线性扫描堆。这个阶段是和应用一起并发运行的。
Final Update Refs 通过再次更新现有的根节点集合完成更新引用阶段,这个阶段会回收内存收集集合中的区域,因为现在的堆已经没有对这些区域中的对象的引用。这是整个内存回收周期最后一个阶段,它的持续时间主要取决于根节点集合的大小。
Concurrent Cleanup 并发清理阶段,回收那些现在没有任何引用的区域集合。
网友评论