点赞再看,能源有限 。微信搜「 程序猿阿朗」,认认真真写文章。
本文 Github.com/niumoo/JavaNotes 和 未读代码博客 曾经收录,有很多知识点和系列文章。
<!–
–>
Java 15 在 2020 年 9 月公布,尽管不是短暂反对版本,然而也带来了 14 个新性能,这些新性能中有不少是非常实用的。
Java 15 官网下载:https://jdk.java.net/archive/
Java 15 官网文档:https://openjdk.java.net/proj…
<!– more –>
Java 15 新性能:
JEP | 形容 |
---|---|
JEP 339 | 爱德华曲线算法(EdDSA) |
JEP 360 | Sealed Classes(密封类)预览 |
JEP 371 | Hidden Classes(暗藏类) |
JEP 372 | 移除 Nashorn JavaScript 引擎 |
JEP 373 | 从新实现 DatagramSocket APII |
JEP 374 | 禁用和废除偏差锁(Biased Locking) |
JEP 375 | instanceof 类型匹配 (二次预览) |
JEP 377 | ZGC: 可扩大低提早垃圾收集器(正式公布) |
JEP 378 | 文本块 |
JEP 379 | Shenandoah: 低进展工夫的垃圾收集器 |
JEP 381 | 删除 Solaris 和 SPARC 端口 |
JEP 383 | 内部内存拜访 API(第二个孵化器)) |
JEP 384 | Records (二次预览) |
JEP 385 | 废除 RMI 激活机制 |
1. JEP 339 爱德华曲线算法(EdDSA)
Java 15 中减少了一个新的密码学算法,爱德华曲线算法(EdDSA)签名算法。它是由 Schnorr 算法倒退而来,在 RFC8032 中被定义实现。
package com.wdbyte;
import java.nio.charset.StandardCharsets;
import java.security.InvalidKeyException;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.Signature;
import java.security.SignatureException;
import java.util.Base64;
public class JEP339 {public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeyException, SignatureException {KeyPairGenerator kpg = KeyPairGenerator.getInstance("Ed25519");
KeyPair kp = kpg.generateKeyPair();
byte[] msg = "www.wdbyte.com".getBytes(StandardCharsets.UTF_8);
Signature sig = Signature.getInstance("Ed25519");
sig.initSign(kp.getPrivate());
sig.update(msg);
byte[] s = sig.sign();
System.out.println(Base64.getEncoder().encodeToString(s));
}
}
输入后果:
VXlpxapU+LSWjVQ0QNJvdpUh6VI6PjSwOQ2pHu65bCfnLR13OyWKunlc9rc+7SMxCh2Mnqf7TmC/iOG8oimbAw==
2. JEP 360:Sealed Classes(密封类)预览
咱们都晓得,在 Java 中如果想让一个类不能被继承和批改,这时咱们应该应用 final
关键字对类进行润饰。不过这种要么能够继承,要么不能继承的机制不够灵便,有些时候咱们可能想让某个类能够被某些类型继承,然而又不能随便继承,是做不到的。Java 15 尝试解决这个问题,引入了 sealed
类,被 sealed
润饰的类能够指定子类。这样这个类就只能被指定的类继承。
而且 sealed
润饰的类的机制具备传递性,它的子类必须应用指定的关键字进行润饰,且只能是 final
、sealed
、non-sealed
三者之一。
示例:犬类(Dog)只能被牧羊犬(Collie)和田园犬(TuGou)继承,应用 sealed
关键字。
package com.wdbyte;
public sealed interface Dog permits Collie, TuGou {//...}
牧羊犬(Collie)只能被边陲牧羊犬(BorderCollie)继承。
package com.wdbyte;
/**
* 牧羊犬
* @author www.wdbyte.com
*/
public sealed class Collie implements Dog permits BorderCollie {}
边陲牧羊犬(BorderCollie)不能被继承,应用 final
关键字。
package com.wdbyte;
/**
*
* @author www.wdbyte.com
*/
public final class BorderCollie extends Collie{}
田园犬(ToGou)能够被任意继承,应用 non-sealed
关键字。
package com.wdbyte;
/**
* @author niulang
*/
public non-sealed class TuGou implements Dog {}
3. JEP 371:Hidden Classes(暗藏类)
这个个性让开发者能够引入一个无奈被其余中央发现应用,且类的生命周期无限的类。这对运行时动静生成类的应用形式非常无利,能够缩小内存占用,上面是一个应用示例。
package com.wdbyte;
public class JEP371Test {public static String lookup() {return "www.wdbyte.com";}
}
把类 JEP371Test
编译后的 Class 转换成 Base64
,而后应用 Java 15 新个性加载调用类中的 lookup
办法。
package com.wdbyte;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
import java.util.Base64;
/**
* @author www.wdbyte.com
*/
public class JEP371 {
private static String CLASS_INFO = "yv66vgAAADQAFAoAAgADBwAEDAAFAAYBABBqYXZhL2xhbmcvT2JqZWN0AQAGPGluaXQ+AQADKClWCAAIAQAOd3d3LndkYnl0ZS5jb20HAAoBABVjb20vd2RieXRlL0pFUDM3MVRlc3QBAARDb2RlAQAPTGluZU51bWJlclRhYmxlAQASTG9jYWxWYXJpYWJsZVRhYmxlAQAEdGhpcwEAF0xjb20vd2RieXRlL0pFUDM3MVRlc3Q7AQAGbG9va3VwAQAUKClMamF2YS9sYW5nL1N0cmluZzsBAApTb3VyY2VGaWxlAQAPSkVQMzcxVGVzdC5qYXZhACEACQACAAAAAAACAAEABQAGAAEACwAAAC8AAQABAAAABSq3AAGxAAAAAgAMAAAABgABAAAAAwANAAAADAABAAAABQAOAA8AAAAJABAAEQABAAsAAAAbAAEAAAAAAAMSB7AAAAABAAwAAAAGAAEAAAAEAAEAEgAAAAIAEw==";
public static void main(String[] args) throws Throwable {byte[] classInBytes = Base64.getDecoder().decode(CLASS_INFO);
Class<?> proxy = MethodHandles.lookup()
.defineHiddenClass(classInBytes, true, MethodHandles.Lookup.ClassOption.NESTMATE)
.lookupClass();
System.out.println(proxy.getName());
MethodHandle mh = MethodHandles.lookup().findStatic(proxy, "lookup", MethodType.methodType(String.class));
String result = (String) mh.invokeExact();
System.out.println(result);
}
}
输入后果:
com.wdbyte.JEP371Test/0x0000000800c01800
www.wdbyte.com
4. JEP 372:移除 Nashorn JavaScript 引擎
Nashorn JavaScript 引擎在 Java 8 中被引入,在 Java 11 中被标记为废除。因为 ECMAScript 语言倒退很快,保护 Nashorn JavaScript 的老本过于昂扬,在 Java 15 中被彻底删除。
扩大浏览:Nashorn JavaScript Engine,Deprecate the Nashorn JavaScript Engine
5. JEP 373:从新实现 DatagramSocket API
Java 13 中从新实现了旧的 Socket API,在介绍 Java 13 时还有一部分做了这方面的介绍。
当初,Java 15 从新实现了遗留的 DatagramSocket
。
扩大浏览:Java 13 新性能介绍
6. JEP 374:禁用和废除偏差锁(Biased Locking)
在之前,JVM 在解决同步操作,如应用 synchronized
同步时,有一套锁的降级机制,其中有一个锁机制就是偏差锁。然而通过目前的 Java 开发环境来看,应用这些被 synchronized
同步的类的机会并不多,如开发者更喜爱应用 HashMap
或者 ArrayList
而非 HashTable
和 Vector
。
即便换个角度,当初应用偏差锁是为了进步性能,现在看来性能晋升的水平和应用次数都不太有用。而偏差锁的引入减少了 JVM 的复杂性。
所以当初偏差锁被默认禁用,在不久的未来将会彻底删除,对于 Java 15,咱们依然能够应用-XX:+UseBiasedLocking
启用偏差锁定,但它会提醒 这是一个已弃用的 API。
7. JEP 375:instanceof 类型匹配 (二次预览)
instanceof
类型匹配在 Java 14 中曾经改良,这次仅仅再次预览,没有任何改变,用于承受更多的应用反馈。这个个性在 Java 16 中成为正式个性。
在之前,应用 instanceof
进行类型判断之后,须要进行对象类型转换后能力应用。
package com.wdbyte;
import java.util.ArrayList;
import java.util.List;
public class Java14BeaforInstanceof {public static void main(String[] args) {Object obj = new ArrayList<>();
if (obj instanceof ArrayList) {ArrayList list = (ArrayList)obj;
list.add("www.wdbyte.com");
}
System.out.println(obj);
}
}
而在 Java 14 中,能够在判断类型时指定变量名称进行类型转换,不便了应用。
package com.wdbyte;
import java.util.ArrayList;
public class Java14Instanceof {public static void main(String[] args) {Object obj = new ArrayList<>();
if (obj instanceof ArrayList list) {list.add("www.wdbyte.com");
}
System.out.println(obj);
}
}
能够看到,在应用 instanceof
判断类型成立后,会主动强制转换类型为指定类型。
输入后果:
[www.wdbyte.com]
扩大浏览:Java 14 新性能介绍
8. JEP 377:ZGC: 可扩大低提早垃圾收集器(正式公布)
ZGC 垃圾收集器在 Java 11 中被引入,然而因为收集器的复杂性,当初决定逐步引入。而后一直的听取用户的反馈倡议修复问题。而当初,曾经很久没有收到用户的问题反馈了,ZGC 是时候投入正式应用阶段了。所以在 Java 15 中 ZGC 正式公布,能够应用上面的参数启用 ZGC。
$ java -XX:+UseZGC className
9. JEP 378:文本块
文本块在 Java 12 JEP 326 原始字符串文字 中引入,在 Java 13 JEP 355:文本块(预览)中开始预览,在 Java 14 JEP 368:文本块(第二次预览),而当初,在 Java 15,文本块是正式的性能个性了。
String content = """{"upperSummary": null,\"sensitiveTypeList": null,"gmtModified":"2011-08-05\s10:50:09",}
""";
System.out.println(content);
扩大浏览:Java 14 新性能介绍 - JEP368 文本块
10. JEP 379:Shenandoah: 低进展工夫的垃圾收集器
Shenandoah 垃圾收集器在 Java 12 中开始引入,Java 15 中成为了正式性能的一部分,能够应用上面的参数启用 Shenandoah 垃圾收集器。
java -XX:+UseShenandoahGC
然而 openJDK 15 中默认是没有 Shenandoah 收集器,想要应用此性能能够下载 AdoptOpenJDK。
为什么 openJDK 中没有 Shenandoah 垃圾收集器?
Shenandoah 是一个高性能、低暂停工夫的垃圾收集器,它是 Red Hat 主导的我的项目。当 Red Hat 第一次提议将 Shenandoah 奉献给 OpenJDK 时,Oracle 明确示意不想反对它,OpenJDK 作为一个免费软件,不想反对 Red Hat 的 Shenandoah 齐全没有问题。
最初 Red Hat 抉择和 Oracle 单干设计一个真正洁净的可插拔垃圾收集器接口,容许任何人轻松抉择垃圾收集器以蕴含在他们的构建中。最终 Shenandoah 进入了 JDK 12,然而没有构建进 OpenJDK。
11. JEP 384:Records(二次预览)
在 Java 14 中引入了 Record 类,Java 15 中对 Record 进行了加强。使它能够反对密封类型、Record 注解以及相干的反射 API 等。
示例:Record 反对密封(sealed)类型。
package com.wdbyte;
/**
* @author www.wdbyte.com
*/
public sealed interface DataBase permits DataBaseSelect, DataBaseUpdate {
}
final record DataBaseSelect(@Deprecated String table, String sql) implements DataBase {
}
final record DataBaseUpdate() implements DataBase {}
在 java.lang.Class
减少了两个公共办法用于获取 Record 类信息:
RecordComponent[] getRecordComponents()
boolean isRecord()
其余更新
JEP 381:删除 Solaris 和 SPARC 端口
Java 14 JEP 362 弃用了 Solaris/SPARC、Solaris/x64 和 Linux/SPARC 端口,当初它在 Java 15 中被正式删除。
JEP 383:内部内存拜访 API(第二个孵化器)
JEP 385:废除 RMI 激活机制
只是废除 RMI 激活机制,不影响 RMI 其余性能。
参考
- https://openjdk.java.net/proj…
- https://docs.oracle.com/en/ja…
- https://mkyong.com/java/what-…
订阅
Hello world : ) 我是阿朗,一线技术工具人,认认真真写文章。
点赞 的个个都是人才,不仅长得帅气难看,谈话还好听。
文章继续更新,能够关注公众号「程序猿阿朗」或拜访「未读代码博客」。
回复【材料】有我筹备的各系列知识点和必看书籍。
本文 Github.com/niumoo/JavaNotes 曾经收录,有很多知识点和系列文章,欢送 Star。