2019独角兽企业重金招聘Python工程师标准>>>
心血来潮想看看jdk11的新特性,喵了下官方文档,简单的翻译了下和增添了些自己的理解。
jdk11是lts版本,这是自 Java 8 后的首个长期支持版本,根据oracle的尿性,三年一个lts,所以这个版本在当前来看算是非常重要的一个版本,未来可能会成为主流。
2018年,美国当地时间9月25日,Oracle 官方宣布 Java 11 (18.9 LTS) 正式发布。
新特性也在官网有了介绍: https://www.oracle.com/technetwork/java/javase/11-relnote-issues-5012449.html
翻看了下还是蛮多新奇的东西。
重要改变有: Applets 和 Web Start Applications 已经从jdk11中删除了,以前在大学的时候用这玩意儿写过贪吃蛇。 和浏览器有关的这部分都移除了,我记得那时候就说不安全了,基本上的浏览器都放弃了java的applet。
在windows和mac上的jre自动自动更新功能取消了。
在Windows和macOS中,以前的版本中安装JDK时可以选择安装JRE。在JDK 11中,没有这个选项了。
在这个版本中,不再提供JRE或服务器JRE。只提供JDK。用户可以使用jlink创建更小的自定义运行时。 jlink是啥? https://docs.oracle.com/javase/9/tools/jlink.htm 可以使用jlink工具创建特定于平台的运行时映像。 运行时映像将包含指定的应用程序模块和只需的平台模块,从而减少运行时映像的大小。
JDK中不再包含JavaFX。现在可以从 openjfx.io 单独下载它。 去年还想用javafx写一个redis的操作工具界面,最后因为懒惰放弃了。。。
JDK 7、8、9和10中附带的 Java Mission Control 不再包含在Oracle JDK中。现在它是一个单独的下载。 刚毕业那会儿得知这个工具的用法,经常本地调试的时候就输入jmc打开界面就开始看线程的情况。
在JDK 11及以后版本中,不再提供法语、德语、意大利语、韩语、葡萄牙语(巴西语)、西班牙语和瑞典语的翻译。
Windows的更新打包格式已从tar.gz更改为.zip,这在Windows系统中更为常见。 macOS的更新包格式已从.app更改为.dmg,这更符合macOS的标准。
jdk11的性功能和增强的有哪些:
关于Java SE 11和JDK 11中的重要增强和新特性的另一个信息来源是Java SE 11 (18.9) (JSR 384)平台规范,它记录了在Java SE 10和Java SE 11之间对规范所做的更改 http://cr.openjdk.java.net/~iris/se/11/latestSpec/
JDK 11发行版包括对Unicode 10.0.0的支持。自从JDK 10发布以来,它支持Unicode 8.0.0, JDK 11结合了Unicode 9.0.0和10.0.0版本,包括: 16,018 新字符: 包括19个新4k电视标准的符号 比特币签名 128个emoji表情符号
10 个新的字符集
Adlam
Bhaiksuki
Marchen
Newa
Osage
Tangut
Masaram Gondi
Nushu
Soyombo
Zanabazar Square
18 个新的字符区 18个新区块,其中包括10个区用于上述新字符集,8个用于下列现有的字符集:
Cyrillic Extended-C
Mongolian Supplement
Ideographic Symbols and Punctuation
Tangut Components
Glagolitic Supplement
Syriac Supplement
Kana Extended-A
CJK Extension F
将 HTTP Client API 标准化,放入了jdk11中,以前写的试用性的api放在 jdk.incubator.http ,现在已经移除掉了,至少代码来自 jdk.incubator.http 的都将更新到标准的包名: java.net.http
java.util.Collection 接口添加了一个新的默认方法 toArray(IntFunction) ,其实看字面意思也能理解,就是允许collection可以转换到一个数组去,具体的可以去看doc。
JDK 11更新了基于 Unicode Consortium's CLDR (Common Locale Data Registry) 的 Locale Data 。 oracle说的Locale Data 应该就是它所支持的语言、地区、字符集和其他地区数据。
编译线程的延迟分配。 多了个 -XX:+UseDynamicNumberOfCompilerThreads
的配置。 动态的控制编译线程数,在TieredCompilation模式下(默认为打开),虚拟机在具有多个cpu的系统上启动大量编译线程,而不管可用内存和编译请求的数量。因为线程即使在空闲的时候也会消耗内存(几乎所有的时间都是空闲的),这导致了资源的低效使用。为了解决这个问题,实现被更改为在启动期间每种类型只启动一个编译器线程,并动态地处理其他线程的启动和关闭。它由一个新的命令行标志控制,默认是打开的。 如果你写过java的gui程序就知道,client和server的即时编译是不一样的,具体的可以去百度下,总之TieredCompilation模式开启的时候,可以使程序启动时,使用client编译器,在程序运行一段时间后,自动切换为server编译器,这样启动的时候超级快,运行之后再对代码进行编译优化然后翻译成更高效的执行码。
ZGC,一个可伸缩的低延迟垃圾收集器(实验性的)。 这个垃圾回收器的主要目的是: 停顿时间不超过10毫秒 停顿时间不会随着堆或实时设置的大小而增加 处理堆的范围从几百兆到几千兆不等的堆
ZGC的核心是并发垃圾收集器,这意味着所有繁重的工作(标记、压缩、引用处理、字符串表清理等)都是在Java线程继续执行时完成的,这极大地降低了垃圾收集对应用程序响应时间的负面影响。 这个垃圾回收机制是实验性的,所以要启用的话需要一起配这两个配置:
-XX:+UnlockExperimentalVMOptions
-XX:+UseZGC
这个实验版本的ZGC启用有以下限制: 只能在 Linux/x64 下使用。 XX:+UseCompressedOops 和 -XX:+UseCompressedClassPointers 配置将不会有任何效果,这两个配置不生效。 -XX:+ClassUnloading 和 -XX:+ClassUnloadingWithConcurrentMark 默认情况下禁用,启用也不会有任何效果。 ZGC不能和oracle的全栈虚拟机GraalVM一起用,说到GraalVM,不得不提下,这玩意儿简直吊炸天,可以将java或者其他语言编译成二进制文件直接执行,具体的自行查看oracle的文档: https://www.graalvm.org
Epsilon GC,一个不做任何事情的垃圾回收器,哈哈哈哈哈哈哈。 这玩意儿也是个实验性的垃圾回收器,不实现任何内存回收机制,它一般是用来做性能测试的,可以对比其他gc的回收成本,很方便的进行测试。
低开销的堆分析。 提供一种采样Java堆分配的低开销方法,可以通过JVMTI访问,这玩意儿好啊,不然采集堆的对象数据简直难受。 设计这个东西的目标是: 足够低的开销,默认情况下可以连续启用。 通过定义良好的编程接口(JVMTI)进行访问。 可以抽样分析所有类型的分配方式,也就是说不限于某种特定的堆区域或者特定的分配方式的区。 实现的方式定义可以独立出来,即不依赖于任何特定的GC算法或VM实现。 可以提供关于活着的Java对象和死去的Java对象的信息。
嵌套访问控制。 它允许多个class同属一个逻辑代码块,但是被编译成多个分散的class文件,它们访问彼此的私有成员无需通过编译器添加访问扩展方法。 这个得看代码,不看代码的话很难讲明白
public class JEP181 {public static class Nest1 {private int varNest1;public void f() throws Exception {final Nest2 nest2 = new Nest2();//这里没问题nest2.varNest2 = 2;final Field f2 = Nest2.class.getDeclaredField("varNest2");//这里在 java 8环境下会报错,在java11中是没问题的f2.setInt(nest2, 2);System.out.println(nest2.varNest2);}}public static class Nest2 {private int varNest2;}public static void main(String[] args) throws Exception {new Nest1().f();}
}
说些题外话,美国一直有加密算法出口限制,近年来,美国放松了加密软件出口的条件,这次增加了一些密码算法的实现不知道和这个有没有关系。
使用RFC7748中描述的Curve25519和Curve448添加新密钥协议方案的实现。 Curve25519/Ed25519/X25519 是著名密码学家 Daniel J. Bernstein 在 2006 年独立设计的椭圆曲线加密 /签名 /密钥交换算法,和现有的任何椭圆曲线算法都完全独立。 关于Curve448的介绍可以看这里: https://en.wikipedia.org/wiki/Curve448
增加了Brainpool EC支持。 对于密码学不是很懂,大致的理解就是增加一种标准,椭圆曲线密码学(ECC)Brainpool标准。 具体的可以看: https://tools.ietf.org/html/rfc5639
实现了ChaCha20和Poly1305密码算法。 又是增加了一些加密的算法实现,说些题外话,美国一直有加密算法出口限制,近年来,美国放松了加密软件出口的条件,这次增加了一些密码算法的实现不知道和这个有没有关系。
增强密钥机制。 多了一个名为 jceks.key.serialFilter
的新安全配置。
RSASSA-PSS 签名支持添加到 SunMSCAPI。
Transport Layer Security (TLS) 1.3。 JDK 11发行版包含TLS 1.3规范的实现(RFC 8446)。
RFC 8009中定义的Kerberos 5支持AES加密和HMAC-SHA2。
Lambda参数的局部变量语法。 在声明lambda表达式的形式参数时,现在可以使用保留类型名称var。 啧啧啧,php啊,简直就是围城。
启动运行单文件源码程序。 通过“shebang”文件和相关技术,增强java启动程序,以运行作为java源代码单个文件提供的程序,包括在脚本中使用。 解释运行java代码,意味着可以像写脚本一样边写边执行java代码,类似于php的cmd模式输入代码实时出结果。