Table of Contents
java12
支持Unicode11
在Linux系统上提供POSIX_SPAWN选项
JVM 常量API
支持压缩数格式
日语中新的一个方形字符支持
在备用存储设备上分配java的堆中的老年代
ZGC: 并发的类卸载
新的命令行Flag -XX:+ExtensiveErrorReports
java.security.manager添加了新的系统属性的选项 disallow 和allow
新的JFR安全事件支持
在krb5.conf中支持dns_canonicalize_hostname
switch表达式(即将实现)
java11
java11背景
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参数的局部变量语法
Flight Recorder - 飞行记录仪
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
java8
java编程语言方面
容器方面
日期时间工具更新
IO和NIO
JDBC
并发Concurrency
HotSpo虚拟机
java.lang 和 java.util
java技术在经过20几年的发展之后,也同时在不停的发生许多的变化。相对于以往而言,java目前一个很大的区别就是版本更新频率,将保持每半年更新一次。本篇博客将随着java的发版动态更新,记录java发版的一些简要而关键的信息。
更新位于java.lang packge,主要包含以下三点
更新位于java.lang packge。
这是一种在linux上启动进程时可以设置的一个属性。对windows开发无影响。
更新位于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虚拟机hotspot
这是一个在G1收集器和Parallel GC收集器中进行的实验,这个实验的功能是在虚拟机工作时,在另一个内存设备(如NV-DIMM内存)上分配Java的堆内存中的老年代即old generation。
更新位于java虚拟机hotspot
Z是java虚拟机新的一款垃圾收集器,它发布于java11,它由Oracle开发,并承诺在数TB数据量的堆上进行垃圾收集时,也只会有非常低的暂停时间。
Z垃圾收集器现在在java12中已经支持类卸载。 通过卸载未被使用的类,可以释放与这些类相关的数据结构,从而降低应用程序的总体占用空间。 ZGC中的并发类卸载,不会停止Java应用程序线程的执行,并且对GC暂停时间没有任何影响。 此功能默认情况下将被启用,但可以使用命令行选项-XX:-ClassUnloading禁用此功能。
更新位于hotspot虚拟机
添加了命令行标志-XX:+ ExtensiveErrorReports,可以更多的记录与hs_err
即使生成的日志可能非常大或包含可能被视为敏感的信息,这些信息也会被打印出来。
更新位于java.security
在JDK实现当中,如果Java虚拟机以系统属性java.security.manager设置为“disallow”启动,则System.setSecurityManager方法不能用于设置安全管理器并将抛出UnsupportedOperationException。 “disallow”选项可以提高从未设置安全管理器的应用程序的运行时性能。
更新位于包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之前的行为一致。
更新位于javac即java编译器
java语言将会增强switch语句,它将可以用作语句或表达式。 使用switch作为表达式通常会使代码更简洁,更易读。
发布于2018年9月的java11是java8之后的又一个长期支持版本-Long-Term Support version.这意味着在未来大量现在运行在java7或者java8上的java应用程序都将会迁移到java11这个版本之上。
以下是此版本的一些重要更改和信息:
引入nests的概念,这是一种访问控制上下文,与Java编程语言中现有的嵌套类型概念保持一致。 嵌套允许逻辑上属于同一代码实体但被编译为不同类文件的类,以访问彼此的私有成员,而无需编译器插入可访问性扩展桥接方法。
这个更改简化了将Java源代码构造映射到类文件的规则,因此对选择使用它们的Java源代码编译器有很多影响:
在生成最新版本的类文件时,将更新javac编译器以充分利用nestmates。
对类文件进行操作或生成或处理字节码的任何工具都可能受到这些更改的影响。 这些工具至少必须容忍新类文件属性的存在,并允许更改字节码规则,比如:
扩展Java类文件格式以支持新的常量池形式CONSTANT_Dynamic。 加载CONSTANT_Dynamic会将创建委托给一个bootstrap方法,就像链接invokedynamic调用站点将链接委托给bootstrap方法一样。
改进现有的字符串和数组内在函数,并在AArch64处理器上为java.lang.Math sin,cos和log函数实现新的内在函数。
Epsilon就是一个试验的代号,这个实验的目的是开发一个处理内存分配但不实现任何实际内存回收机制的GC。 一旦可用的Java堆耗尽,JVM将关闭。
实验的目的是在有限的内存分配限制和尽可能低的延迟开销下,提供完全被动的GC实现。但代价是会占用一定的内存和内存吞吐量。成功的体现是在实现了孤立的代码更改的同时,不接触其他GC,并在JVM的其余部分进行最小的更改。
在有非常多的生存周期非常短的service的分布式系统中,这个GC收集器会非常的有效率
将Java EE和CORBA模块从Java SE平台和JDK当中移除。 这些模块在Java SE9当中就已经是deprecated状态了。
通过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
从LineSubscriber添加,支持将响应主体适配到String.Subscriber的String行。
添加了BodySubscriber.mapping,用于从一种响应体类型到另一种响应体类型的通用映射。
推送承诺支持已经过重新设计,以减少其对API的影响,并使其更符合常规请求/响应。具体来说,MultiSubscriber和MultiResultMap已被删除。推送承诺现在通过功能接口PushPromiseHandler处理,该接口可选择在发送操作期间提供。
通过用NORMAL替换SAME_PROTOCOL和SECURE策略,简化了HttpClient.Redirect策略。已经观察到先前命名的SECURE没有真正适当地命名并且应该被重命名为NORMAL,因为它可能适合于大多数正常情况。鉴于上面提到的新命名的NORMAL,SAME_PROTOCOL出现奇怪的命名,可能令人困惑,并且不太可能被使用。
WebSocket.MessagePart已被删除。在接收方使用此枚举来指示消息的传递是否完整。它与发送端不对称,为此目的使用简单的布尔值。另外,已经观察到用简单的布尔值处理接收的消息显着地减少并简化了接收代码逻辑。确定作为整体传递的消息,上述消息部分的好处和主要目的之一,已证明不具有自身的重要性。
在声明隐式类型的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的需要迈出了一大步。
提供低开销的数据收集框架,用于对Java应用程序和HotSpot JVM进行故障排除
这个功能的目标包括:
这将为需要性能和故障排除帮助的开发人员带来很多帮助。
实现RFC 7539中指定的ChaCha20和ChaCha20-Poly1305密码.ChaCha20是一种相对较新的流密码,可以替代旧的,不安全的RC4流密码。
增强java启动程序以运行作为Java源代码的单个文件提供的程序,包括通过“shebang”文件和相关技术从脚本中使用。
从JDK 10开始,java启动程序以三种模式运行:启动类文件,启动JAR文件的主类,或启动模块的主类。 这里我们添加一个新的第四种模式:启动在源文件中声明的类。
对于java初学者来说,这无疑会使得他们运行java程序更加的简单。
提供一种低开销的Java堆分配采样方法,可通过JVMTI访问。
提供一种从JVM获取有关Java对象堆分配的信息的方法:
Z垃圾收集器,也称为ZGC,是一个可扩展的低延迟垃圾收集器。
这个实验的目标包括:
java开发人员有雄心壮志为大量相关工作负载实现这些目标。 但他们也提到并未将这些目标视为对每种可能的工作量的硬性要求。
弃用Nashorn JavaScript脚本引擎和API以及jjs工具,会在将来的版本中删除它们
在java.util.jar中弃用pack200和unpack200工具以及Pack200 API。
在介绍完了java11之后,不妨回顾一下java8的主要更新
提供了一组包含全面的日期时间模型的包。
-XX:+ UseAES -XX:+ UseAESIntrinsics 要禁用硬件AES,可以使用: -XX:-UseAES -XX:-UseAESIntrinsics