Java 10 特性和更新
原文:https://www.studytonight.com/java-10/java-10-features-and-updates
Oracle 在 2018 年 3 月 20 日发布了作为 Java 10 的 Java 新版本,其中有几个特性和增强功能。这些特性是对垃圾收集和编译以及局部变量类型的增强。
Java 10 版本计划是一个短期版本,它的更新和生命周期将在六个月后结束。在这里,我们讨论它的特点,指出如下。
将 JDK 森林整合到一个存储库中
垃圾收集器接口
G1 并行全 GC
应用类-数据共享
线程本地握手
删除本机头生成工具(javah)
附加 Unicode 语言-标记扩展
替代内存设备上的堆分配
基于 Java 的实时编译实验
根证书
基于时间的版本控制
局部变量类型推断
类型推断是一个允许编译器推断变量或数据类型的概念。Java 已经在集合中使用类型推断,在匿名内部类中使用<>
菱形运算符。在 Java 10 版本中,这个特性得到了增强,将类型推断扩展到带有初始化器的局部变量声明。
这意味着现在我们可以在不指定其类型(int、float 等)的情况下创建局部变量。我们可以声明局部变量、每个循环的变量 in、for 循环,但不能用于方法参数、方法返回类型、字段或任何其他类型的变量声明。
示例:Java 10 中的局部变量
// Valid Declarations
var a = 10;
var str = "studytonight";
将 JDK 森林整合到一个存储库中
Java 10 将 JDK 森林存储库简化为一个单一的存储库,以简化开发。
在 Java 的早期版本中,JDK 被分成了几个存储库。比如 JDK 9 由八个存储库组成:root、nashorn、jaxp、jaxws、JDK、CORBA、hotspot 和 langtools。
在 Java 10 中,所有八个存储库都被收集到一个存储库中。
请参见下面的示例,JDK 森林存储库是如何组合成一个存储库的。
$ROOT/jdk/src/java.base
...
$ROOT/langtools/src/java.compiler
...
请参见下面的示例,JDK 森林存储库是如何组合成一个存储库的。
$ROOT/src/java.base
...
$ROOT/src/java.compiler
...
垃圾收集器接口
Java 10 包括一个新的更干净的垃圾收集器,以改善不同垃圾收集器的源代码隔离。Java 引入了一个干净的垃圾收集器接口,有助于实现新的收集器,并使代码更加干净、简单。
在旧版本的 JDK 中,垃圾收集器(GC)组件分散在代码库的各个部分。但是在 Java 10 中,它是 JVM 源代码中的一个干净的接口,允许快速轻松地集成替代收集器。
G1 并行全 GC
在 Java 9 中,G1 是默认的垃圾收集器。现在,这个默认的垃圾收集器是一个并行收集器,并且有一个并行的完整垃圾收集器。最初,G1 垃圾收集器不能作为完全收集工作,但后来,它被允许足够快地回收内存。G1 使用单线程标记-扫描-压缩算法。
应用类-数据共享
类数据共享也称为 CDS,旨在改进启动和占用空间,扩展现有的 CDS 功能,允许将应用类放入共享归档中。其目的是通过在不同的 Java 进程之间共享公共类元数据来减少占用空间。
它缩短了启动时间,并允许将 JDK 运行时映像文件和应用类路径中的归档类加载到内置平台中。
CDS 概念是在 JDK 5 中引入的,它允许将一组类预处理成一个共享的归档文件。这有助于减少启动时间,并且当多个 JVM 共享同一个归档文件时,还可以减少动态内存占用。
最新的 CDS 版本仅允许引导类加载器加载归档类,应用 CDS 扩展 CDS 以允许内置系统类加载器。
线程本地握手
在 Java 10 中,Java 引入了一种新的方法来执行回调,而无需在线程上执行全局虚拟机安全点。回调可以是一个握手操作,在线程处于安全状态时为每个 JavaThread 执行。
当线程处于阻塞状态时,回调可以由虚拟机线程执行,也可以由它自己执行。
我们可以理解安全指向和握手,因为线程操作将尽快在所有线程上执行,并且一旦它自己的操作完成,它们将继续执行。它还可以与单个的 JavaThread 进行握手。
删除本机头生成工具(javah)
Javah 是一个用于生成头文件的 Java 工具。在 Java 10 中,javah 已经从 JDK 移除。
在 JDK 8 中,高级功能被添加到 javac 中,取代了 javah。该功能提供了在编译 Java 源代码时编写本机头文件的能力。因此不再需要 javah 工具。
附加 Unicode 语言-标记扩展
Java 10 改进和增强了java.util.Locale
和相关的 API,以实现额外的 Unicode 扩展。它支持最初在 Java SE 7 版本中添加的 BCP 47 语言标签,对 Unicode 区域设置扩展的支持仅限于日历和数字。
在 JDK 9 之前,支持的 BCP 47 U 语言标签扩展是ca
和nu
,但是在 Java 10 中,支持以下附加扩展:
cu
(币种)fw
(一周的第一天)rg
(区域覆盖)tz
(时区)
基于 Java 的实时编译实验
在 Java 10 中,我们可以使用基于 Java 的 JIT 编译器,Graal 作为 Linux 平台上的实验性 JIT 编译器。要将 Grall 作为 JIT 编译器启用,请使用以下命令:
-XX:+UnlockExperimentalVMOptions -XX:+UseJVMCICompiler
将启用 Graal 作为 Linux/x64 平台下的实验性 JIT 编译器。Graal 将使用 JDK 9 中引入的 JVM 编译器接口。
根证书
甲骨文已经向开源发布了 Java SE CA 程序的根证书,以使 OpenJDK 构建对开发人员更具吸引力和可用性。这将有助于减少 OpenJDK 版本和甲骨文 JDK 版本之间的差异。
开源根证书必须由甲骨文贡献者协议(OCA)或同等协议签署,以授予甲骨文开源其证书的权利。如果根证书没有签署协议,那么此时将不包括在内。
基于时间的版本控制
Java 10 将使用基于时间的版本模型来定义特性版本,它可以包含新特性和更新版本。
了解一个版本有多老是有帮助的,这样开发人员可以决定是否用最新的安全修复和更新将其升级到更新的版本。
六个月发布模型 Java 10 中版本号的格式:
在六个月发布模式下,Java 使用了以下三个版本号元素:
$FEATURE:
此元素代表添加的功能,每六个月递增一次:例如,2018 年 3 月的版本是 JDK 10,2018 年 9 月的版本是 JDK 11。$INTERIM:
对于六个月发布模型,始终为零,因为六个月模型不包括中期发布。它保留在这里是为了将来的灵活性。$UPDATE:
在$FEATURE
递增一个月后递增,之后每三个月递增一次:2018 年 4 月发布的是 JDK 10.0.1,7 月发布的是 JDK 10.0.2,以此类推。