Table of Contents
新的命令行Flag -XX:+ExtensiveErrorReports
java.security.manager添加了新的系统属性的选项 disallow 和allow
在krb5.conf中支持dns_canonicalize_hostname
Nest-Based Access Control – 基于嵌套的访问控制
Dynamic Class-File Constants – 动态类文件常量
Improve Aarch64 Intrinsics – 提高Aarch64内联函数
Epsilon: A No-Op Garbage Collector (Experimental) – 无垃圾垃圾收集器实验
Remove the Java EE and CORBA Modules – 删除JavaEE和CORBA模块
HTTP Client (Standard) – 标准的Http Client
Local-Variable Syntax for Lambda Parameters – LAMBDA参数的局部变量语法
ChaCha20 and Poly1305 Cryptographic Algorithms – 密码算法
Launch Single-File Source-Code Programs – 启动单文件源程序
Low-Overhead Heap Profiling – 低开销的堆
ZGC: A Scalable Low-Latency Garbage Collector (Experimental) – 一种可扩展的低延迟试验垃圾收集器
Deprecate the Nashorn JavaScript Engine – 弃用了NASHON JavaScript引擎
Deprecate the Pack200 Tools and API – 弃用了PAC200工具和API
概述
java技术在经过20几年的发展之后,也同时在不停的发生许多的变化。相对于以往而言,java目前一个很大的区别就是版本更新频率,将保持每半年更新一次。本篇博客将随着java的发版动态更新,记录java发版的一些简要而关键的信息。
java12
支持Unicode11
更新位于java.lang packge,主要包含以下三点
- 支持684中新的字母 new characters
- 支持11种新的符号
在Linux系统上提供POSIX_SPAWN选项
更新位于java.lang packge。
这是一种在linux上启动进程时可以设置的一个属性。对windows开发无影响。
JVM 常量API
更新位于java.lang.invoke包。
在包invoke当中引入了一个全新的api来描述 类文件和运行时文件,尤其是常量池中的常量。实现的方式是通过通过定义一个基于值的符号引用类型。它能支持描述各种类型的可加载的常量。
注意,符号引用描述是纯粹从名称角度出发的。有一些类可以自己作为自己的符号引用,如String类。对于链接型的常量,则添加了一系列符号引用类型(ClassDesc,MethodTypeDesc,MethodHandleDesc和DynamicConstantDesc)用于描述这些常量的信息。
支持压缩数格式
更新位于包java.text
NumberFormat增加了对以紧凑形式格式化数字的支持。 紧凑数字格式是指以简短或人类可读形式表示的数字。 例如,在en_US语言环境中,1000可以格式化为“1K”,1000000可以格式化为“1M”,具体取决于NumberFormat.Style指定的样式。 紧凑数字格式由LDML的Compact Number格式规范定义。 例如:
NumberFormat fmt = NumberFormat.getCompactNumberInstance(Locale.US, NumberFormat.Style.SHORT);
String result = fmt.format(1000);
上面例子返回打结果就是’1K’,也就是代表的1000
日语中新的一个方形字符支持
更新位于包java.util:i8n.
使用字符:U+32FF,来代表日语中的新的方形字符。这个字符将在2019年5月开始在日本正式使用。
在备用存储设备上分配java的堆中的老年代
更新位于java虚拟机hotspot
这是一个在G1收集器和Parallel GC收集器中进行的实验,这个实验的功能是在虚拟机工作时,在另一个内存设备(如NV-DIMM内存)上分配Java的堆内存中的老年代即old generation。
ZGC: 并发的类卸载
更新位于java虚拟机hotspot
Z是java虚拟机新的一款垃圾收集器,它发布于java11,它由Oracle开发,并承诺在数TB数据量的堆上进行垃圾收集时,也只会有非常低的暂停时间。
Z垃圾收集器现在在java12中已经支持类卸载。 通过卸载未被使用的类,可以释放与这些类相关的数据结构,从而降低应用程序的总体占用空间。 ZGC中的并发类卸载,不会停止Java应用程序线程的执行,并且对GC暂停时间没有任何影响。 此功能默认情况下将被启用,但可以使用命令行选项-XX:-ClassUnloading禁用此功能。
新的命令行Flag -XX:+ExtensiveErrorReports
更新位于hotspot虚拟机
添加了命令行标志-XX:+ ExtensiveErrorReports,可以更多的记录与hs_err <pid> .log文件中报告的崩溃相关的信息。 在项目build过程当中默认禁用,可以在需要最大信息的环境中打开 。
即使生成的日志可能非常大或包含可能被视为敏感的信息,这些信息也会被打印出来。
java.security.manager添加了新的系统属性的选项 disallow 和allow
更新位于java.security
在JDK实现当中,如果Java虚拟机以系统属性java.security.manager设置为“disallow”启动,则System.setSecurityManager方法不能用于设置安全管理器并将抛出UnsupportedOperationException。 “disallow”选项可以提高从未设置安全管理器的应用程序的运行时性能。
新的JFR安全事件支持
更新位于包java.security
在java security包中加入了四个新的JFR事件。此功能启动时默认关闭。这四个事件分别是:
jdk.SecurityPropertyModificatio
jdk.TLSHandshake
jdk.X509Validation
jdk.X509Certificate
在krb5.conf中支持dns_canonicalize_hostname
JDK 支持krb5.conf配置文件中的dns_canonicalize_hostname标志。当此flag设置为“true”时,服务主体名称中的短主机名将被规范化为完全限定的域名。 否则,不执行规范化。 该falg默认值是true”。 与JDK 12之前的行为一致。
switch表达式(即将实现)
更新位于javac即java编译器
java语言将会增强switch语句,它将可以用作语句或表达式。 使用switch作为表达式通常会使代码更简洁,更易读。
java11
java11背景
发布于2018年9月的java11是java8之后的又一个长期支持版本-Long-Term Support version.这意味着在未来大量现在运行在java7或者java8上的java应用程序都将会迁移到java11这个版本之上。
以下是此版本的一些重要更改和信息:
- Applet和Web Start应用程序所需的部署堆栈在JDK 9中已弃用,并已在JDK 11中删除。
- 如果没有部署堆栈,则已从支持的JDK 11配置列表中删除了支持的浏览器的整个部分。
- 在Windows和macOS上可用于JRE安装的自动更新不再可用。
- 在Windows和macOS中,在先前版本中安装JDK可选地安装了JRE。在JDK 11中,不再有这个选项。
- 在此版本中,不再提供JRE或Server JRE。仅提供JDK。用户可以使用jlink创建较小的自定义运行时。
- JDK中不再包含JavaFX。它现在可以从openjfx.io单独下载。
- Oracle JDK不再包含JDK 7,8,9和10中提供的Java Mission Control。它现在是一个单独的下载。
- 以前的版本被翻译成英语,日语和简体中文以及法语,德语,意大利语,韩语,葡萄牙语(巴西),西班牙语和瑞典语。但是,在JDK 11及更高版本中,不再提供法语,德语,意大利语,韩语,葡萄牙语(巴西),西班牙语和瑞典语翻译。
- Windows的更新包装格式已从tar.gz更改为.zip,这在Windows操作系统中更为常见。
- 更新后的macOS包格式已从.app更改为.dmg,这更符合macOS的标准。
Nest-Based Access Control – 基于嵌套的访问控制
引入nests的概念,这是一种访问控制上下文,与Java编程语言中现有的嵌套类型概念保持一致。 嵌套允许逻辑上属于同一代码实体但被编译为不同类文件的类,以访问彼此的私有成员,而无需编译器插入可访问性扩展桥接方法。
这个更改简化了将Java源代码构造映射到类文件的规则,因此对选择使用它们的Java源代码编译器有很多影响:
- 正确生成与nest相关的classfile属性
- 完善以前需要的访问桥接方法并为私人嵌套成员生成直接成员访问指令
- 发出正确/适当的调用字节码
- 能够将其他合成方法更改为私有而不是包私有(甚至消除它们,或者用共享但私有的方法句柄常量替换它们)
在生成最新版本的类文件时,将更新javac编译器以充分利用nestmates。
对类文件进行操作或生成或处理字节码的任何工具都可能受到这些更改的影响。 这些工具至少必须容忍新类文件属性的存在,并允许更改字节码规则,比如:
- javap类文件检查工具,
- Pack200实现
- 也在JDK内部使用的ASM字节码操作框架。
Dynamic Class-File Constants – 动态类文件常量
扩展Java类文件格式以支持新的常量池形式CONSTANT_Dynamic。 加载CONSTANT_Dynamic会将创建委托给一个bootstrap方法,就像链接invokedynamic调用站点将链接委托给bootstrap方法一样。
Improve Aarch64 Intrinsics – 提高Aarch64内联函数
改进现有的字符串和数组内在函数,并在AArch64处理器上为java.lang.Math sin,cos和log函数实现新的内在函数。
Epsilon: A No-Op Garbage Collector (Experimental) – 无垃圾垃圾收集器实验
Epsilon就是一个试验的代号,这个实验的目的是开发一个处理内存分配但不实现任何实际内存回收机制的GC。 一旦可用的Java堆耗尽,JVM将关闭。
实验的目的是在有限的内存分配限制和尽可能低的延迟开销下,提供完全被动的GC实现。但代价是会占用一定的内存和内存吞吐量。成功的体现是在实现了孤立的代码更改的同时,不接触其他GC,并在JVM的其余部分进行最小的更改。
在有非常多的生存周期非常短的service的分布式系统中,这个GC收集器会非常的有效率
Remove the Java EE and CORBA Modules – 删除JavaEE和CORBA模块
将Java EE和CORBA模块从Java SE平台和JDK当中移除。 这些模块在Java SE9当中就已经是deprecated状态了。
HTTP Client (Standard) – 标准的Http Client
通过JEP 110标准化JDK 9中引入的孵化HTTP客户端API,并在JDK 10中进行更新。
通过静态工厂方法创建的BodyPublisher,BodyHandler和BodySubscriber的预定义实现已按照复数命名约定移出到单独的不可实例化的实用工厂类中。这提高了这些相对较小的接口的可读性。静态工厂方法的名称也按以下大类更新:
fromXxx:来自标准订户的适配器,例如采用Flow.Subscriber返回一个BodySubscriber。
ofXxx:创建新的预定义Body [Publisher | Handler | Subscriber]的工厂,它们执行有用的常见任务,例如将响应主体作为String处理,或将主体流式传输到File。
other:Combinators(采用BodySubscriber返回BodySubscriber)和其他有用的操作。
添加了一些BodyHandler和相应的BodySubscriber,以提高常见场景的可用性:
discard(对象替换)组合丢弃/忽略响应主体并允许给定替换。反馈表明这可能看起来令人困惑。它已被删除并替换为两个单独的处理程序:1)丢弃(),和2)替换(对象替换)。
添加了ofLines(),它返回一个BodyHandler <Stream <String >>,以支持逐行传输响应体的流。提供与BufferedReader.lines()类似的语义。
从LineSubscriber添加,支持将响应主体适配到String.Subscriber的String行。
添加了BodySubscriber.mapping,用于从一种响应体类型到另一种响应体类型的通用映射。
推送承诺支持已经过重新设计,以减少其对API的影响,并使其更符合常规请求/响应。具体来说,MultiSubscriber和MultiResultMap已被删除。推送承诺现在通过功能接口PushPromiseHandler处理,该接口可选择在发送操作期间提供。
通过用NORMAL替换SAME_PROTOCOL和SECURE策略,简化了HttpClient.Redirect策略。已经观察到先前命名的SECURE没有真正适当地命名并且应该被重命名为NORMAL,因为它可能适合于大多数正常情况。鉴于上面提到的新命名的NORMAL,SAME_PROTOCOL出现奇怪的命名,可能令人困惑,并且不太可能被使用。
WebSocket.MessagePart已被删除。在接收方使用此枚举来指示消息的传递是否完整。它与发送端不对称,为此目的使用简单的布尔值。另外,已经观察到用简单的布尔值处理接收的消息显着地减少并简化了接收代码逻辑。确定作为整体传递的消息,上述消息部分的好处和主要目的之一,已证明不具有自身的重要性。
Local-Variable Syntax for Lambda Parameters – LAMBDA参数的局部变量语法
在声明隐式类型的lambda表达式的形式参数时允许使用var。
可以隐式地键入lambda表达式,并从中推断出所有形式参数的类型:
(x, y) -> x.process(y) // implicitly typed lambda expression
Java SE 10使隐式类型可用于局部变量:
var x = new Foo();
for (var x : xs) { ... }
try (var x = ...) { ... } catch ...
为了与局部变量保持一致,jdk开发人员希望允许’var’用于隐式类型的lambda表达式的形式参数:
(var x, var y) -> x.process(y) // implicit typed lambda expression
统一性的一个好处是修饰符,特别是注释,可以应用于局部变量和lambda形式,而不会失去简洁性:
@Nonnull var x = new Foo();
(@Nonnull var x, @Nullable var y) -> x.process(y)
这个改动朝着消除使用sun.misc的需要迈出了一大步。
Flight Recorder – 飞行记录仪
提供低开销的数据收集框架,用于对Java应用程序和HotSpot JVM进行故障排除
这个功能的目标包括:
- 提供用于生成和使用数据作为事件的API
- 提供缓冲机制和二进制数据格式
- 允许配置和过滤事件
- 为OS,HotSpot JVM和JDK库提供事件
这将为需要性能和故障排除帮助的开发人员带来很多帮助。
ChaCha20 and Poly1305 Cryptographic Algorithms – 密码算法
实现RFC 7539中指定的ChaCha20和ChaCha20-Poly1305密码.ChaCha20是一种相对较新的流密码,可以替代旧的,不安全的RC4流密码。
Launch Single-File Source-Code Programs – 启动单文件源程序
增强java启动程序以运行作为Java源代码的单个文件提供的程序,包括通过“shebang”文件和相关技术从脚本中使用。
从JDK 10开始,java启动程序以三种模式运行:启动类文件,启动JAR文件的主类,或启动模块的主类。 这里我们添加一个新的第四种模式:启动在源文件中声明的类。
对于java初学者来说,这无疑会使得他们运行java程序更加的简单。
Low-Overhead Heap Profiling – 低开销的堆
提供一种低开销的Java堆分配采样方法,可通过JVMTI访问。
提供一种从JVM获取有关Java对象堆分配的信息的方法:
- 足够低的开销足以在默认情况下连续启用,
- 可通过定义明确的程序化界面访问,
- 可以对所有分配进行采样(即,不限于在一个特定堆区域中的分配或以一种特定方式分配的分配),
- 可以以与实现无关的方式定义(即,不依赖于任何特定的GC算法或VM实现)
- 可以提供有关存活的和死去的Java对象的信息。
ZGC: A Scalable Low-Latency Garbage Collector (Experimental) – 一种可扩展的低延迟试验垃圾收集器
Z垃圾收集器,也称为ZGC,是一个可扩展的低延迟垃圾收集器。
这个实验的目标包括:
- GC暂停时间不应超过10毫秒
- 处理堆的大小从相对较小(几百兆字节)到非常大(多太字节)不等
- 与使用G1相比,应用程序吞吐量减少不超过15%
- 为未来的GC功能和优化利用彩色指针和负载障碍奠定基础
- 最初支持的平台:Linux / x64
java开发人员有雄心壮志为大量相关工作负载实现这些目标。 但他们也提到并未将这些目标视为对每种可能的工作量的硬性要求。
Deprecate the Nashorn JavaScript Engine – 弃用了NASHON JavaScript引擎
弃用Nashorn JavaScript脚本引擎和API以及jjs工具,会在将来的版本中删除它们
Deprecate the Pack200 Tools and API – 弃用了PAC200工具和API
在java.util.jar中弃用pack200和unpack200工具以及Pack200 API。
在介绍完了java11之后,不妨回顾一下java8的主要更新
java8
java编程语言方面
- Lambda Expressions是一种新的语言功能,已在此版本中引入。通过Lambda表达式,我们能够将一个功能视为方法参数,或将代码视为数据。 Lambda表达式允许我们更紧凑地表示单方法接口(即功能接口)的实例。
- 方法引用为已经命名的方法提供了一种易于阅读的lambda表达式。
- 默认方法允许将新功能添加到库的接口,并确保与为这些接口的旧版本编写的代码的二进制兼容性。
- 重复注释提供了对同一声明或类型使用多次应用相同注释类型的功能。
- 类型注释提供了在使用类型的任何地方应用注释的功能,而不仅仅是在声明上。 与可插拔类型系统一起使用时,此功能可以改进代码的类型检查。Java 8扩展了注解的范围,几乎可以为任何东西添加注解,包括局部变量、泛型类、父类与接口的实现,方法的异常也能添加注解。
- 改进了类型推断。
- 支持方法参数反射。
容器方面
- 新的java.util.stream包中的类提供了一个Stream API,以支持对元素流的功能样式操作。 Stream API集成到Collections API中,可以对集合进行批量操作,例如顺序或并行map-reduce转换。
- 改进了HashMap等容器在键值key冲突时的性能。即提高了Hash碰撞处理的效率,这一点在新的HashMap实现源码中得到了体现
日期时间工具更新
提供了一组包含全面的日期时间模型的包。
IO和NIO
- 提供了基于Solaris事件端口机制的Solaris的新SelectorProvider实现。将系统属性java.nio.channels.spi.Selector设置为值sun.nio.ch.EventPortSelectorProvider即可使用。
- 减小了<JDK_HOME> /jre/lib/charsets.jar文件的大小
- 对java.lang.String(byte [],*)构造函数和java.lang.String.getBytes()方法的性能改进。
JDBC
- JDBC-ODBC Bridge已被删除。
- JDBC 4.2引入了一些新功能。
并发Concurrency
- 在java.util.concurrent.ConcurrentHashMap类中添加了一些方法,以支持基于新添加的流工具和lambda表达式的聚合操作。
- 在java.util.concurrent.atomic包的类中添加了一些方法中以支持可伸缩的可更新变量。
- 在java.util.concurrent.ForkJoinPool类中添加了方法以支持公共池。
- 添加了java.util.concurrent.locks.StampedLock类,以提供基于功能的锁,其中包含三种控制读/写访问的模式。
HotSpo虚拟机
- 添加了硬件内在函数以使用高级加密标准(AES)。 UseAES和UseAESIntrinsics标志可用于为Intel硬件启用基于硬件的AES内在函数。 硬件必须是2010或更新的Westmere硬件。 例如,要启用硬件AES,请使用以下标志:
-XX:+ UseAES -XX:+ UseAESIntrinsics 要禁用硬件AES,可以使用: -XX:-UseAES -XX:-UseAESIntrinsics
- 去除了PermGen这一块内存空间。代替他的是metaspace
- 提供方法调用的字节代码指令支持Java编程语言中的缺省方法。
java.lang 和 java.util
- 提供并行Array排序
- 支持标准编码和解码Base64
- 提供无符号算术支持