你好啊,我是大阳,本文主要介绍Java10新特性,并提供一些代码示例。不过Java10的新特性大多数是开发者不关心的内容。
Java 9发布后,Java 10 来得非常快。与之前的版本不同,Java 10 没有那么多令人兴奋的特性,但它仍然有一些重要的更新会改变你的编码方式,以及影响其他未来的 Java 版本。
本文主要内容:
- var关键字:局部变量类型推断(它被称为是 JDK 10 中开发人员唯一真正关心的功能)
- 基于时间的发布版本控制
- 垃圾收集器接口
- G1 的并行全 GC
- 替代存储设备上的堆分配
- 将多JDK 林 整合到单个存储库中
- 应用程序类-数据共享
- 附加 Unicode 语言标签扩展
- 根证书
- 基于 Java 的 JIT 编译器(实验性)
- Thread-Local握手
- 删除 Native-Header 生成工具
- 新增的API
- 删除的API
1. var关键字:局部变量类型推断
Java 现在有var
声明。它允许开发者在不指定其类型的情况下声明局部变量。变量的类型将从创建的实际对象的类型中推断出来。它被称为是 JDK 10 中开发人员唯一真正使用到的功能。例如
var str = "Hello world";
//等同于
String str = "Hello world";
2. 基于时间的发布版本控制
从 Java 10 开始,Oracle 采用了基于时间的版本字符串方案。版本号的新格式为:
$FEATURE.$INTERIM.$UPDATE.$PATCH
与旧版本不同,新的基于时间的版本不会延迟,并且功能将每六个月发布一次,并且对版本中可以发布的功能没有限制。
也有长期版本 (LTS)。主要面向企业客户。产品的 LTS 版本将提供 Oracle 的首要且持续的支持,并且每 3 年提供一次。此外,这些版本的更新将至少提供三年。
3. 垃圾收集器接口
在早期的 JDK 结构中,组成垃圾收集器 (GC) 实现的组件分散在代码库的各个部分。它在 Java 10 中发生了变化。现在,它是 JVM 源代码中的一个干净的接口,允许快速轻松地集成替代收集器。它将改善不同垃圾收集器的源代码隔离。
这纯粹是重构。之前工作的一切都需要事后工作,性能不应该倒退。
4. G1 的并行全 GC
Java 9 引入了 G1(垃圾优先)垃圾收集器。G1 垃圾收集器旨在避免完全收集,但是当并发收集无法足够快地回收内存时。通过此更改,将发生回退完整 GC。
G1 的完整 GC 的当前实现使用单线程标记-扫描-紧凑算法。此更改将并行化 mark-sweep-compact 算法并使用相同数量的线程。当收集的并发线程无法足够快地恢复内存时,它将被触发。
线程数可以通过-XX:ParallelGCThreads
选项来控制。
5. 替代存储设备上的堆分配
此更改的目标是使 HotSpot VM 能够在用户指定的备用内存设备(例如 NV-DIMM)上分配 Java 对象堆。
要在此类内存中分配堆,我们可以添加一个新选项-XX:AllocateHeapAt=
. 此选项将获取文件系统的路径并使用内存映射来实现在内存设备上分配对象堆的预期结果。现有的与堆相关的标志,如-Xmx
、-Xms
等,以及与垃圾收集相关的标志将继续像以前一样工作。
6. 将 JDK 林整合到单个存储库中
作为此更改的一部分,JDK 林的众多存储库被合并到一个存储库中,以简化和简化开发。
在 JDK 9 中有八个存储库:root
、corba
、hotspot
、jaxp
、jaxws
、jdk
、langtools
和nashorn
. 在统一的林中,Java 模块的代码通常组合在一个顶级src
目录下。例如,今天在 JDK 林中有基于模块的目录,如
$ROOT/jdk/src/java.base
...
$ROOT/langtools/src/java.compiler
...
在合并的森林中,此代码改为组织为-
$ROOT/src/java.base
$ROOT/src/java.compiler
...
7. 应用程序类-数据共享
此功能的目标是改善启动足迹,扩展现有的类数据共享 (“CDS”) 功能以允许将应用程序类放置在共享存档中。
JDK 5 中引入的类数据共享允许将一组类预处理为共享存档文件,然后可以在运行时进行内存映射以减少启动时间。当多个 JVM 共享同一个归档文件时,它还可以减少动态内存占用。
目前 CDS 只允许引导类加载器加载归档类。应用程序 CDS 允许内置系统类加载器、内置平台类加载器和自定义类加载器加载归档类。
指定-XX:+UseAppCDS
命令行选项以启用系统类加载器、平台类加载器和其他用户定义的类加载器的类数据共享。
8. 附加 Unicode 语言标签扩展
它的目标是增强java.util.Locale
和相关的 API 以实现BCP 47语言标签的额外 Unicode 扩展。最初在 Java SE 7 中添加了对 BCP 47 语言标签的支持,支持仅限于日历和数字的 Unicode 语言环境扩展。此 JEP 将在相关 JDK 类中实现更多最新LDML 规范中指定的扩展。
此 JEP 将添加对以下附加扩展的支持:
- cu(货币类型)
- fw(一周的第一天)
- rg(区域覆盖)
- tz(时区)
修改后的相关API有:
java.text.DateFormat::get*Instance
java.text.DateFormatSymbols::getInstance
java.text.DecimalFormatSymbols::getInstance
java.text.NumberFormat::get*Instance
java.time.format.DateTimeFormatter::localizedBy
java.time.format.DateTimeFormatterBuilder::getLocalizedDateTimePattern
java.time.format.DecimalStyle::of
java.time.temporal.WeekFields::of
java.util.Calendar::{getFirstDayOfWeek,getMinimalDaysInWeek}
java.util.Currency::getInstance
java.util.Locale::getDisplayName
java.util.spi.LocaleNameProvider
9. 根证书
cacerts 密钥库是 JDK 的一部分,旨在包含一组根证书,可用于在各种安全协议中使用的证书链中建立信任。然而,JDK 源代码中的 cacerts 密钥库目前是空的。
cacerts 密钥库将填充一组由 Oracle 的 Java SE 根 CA 程序的 CA 颁发的根证书。许多供应商已经签署了所需的协议,并且每个供应商都将包含一份根证书列表。未签署协议的将不包括在内。那些需要更长时间处理的将包含在下一个版本中。
这也意味着 Oracle 和 Open JDK 二进制文件在功能上是相同的。TLS 等关键安全组件将默认在未来的 OpenJDK 构建中工作。
10. 基于 Java 的 JIT 编译器(实验性)
此功能使基于 Java 的 JIT 编译器Graal可以用作 Linux/x64 平台上的实验性 JIT 编译器。Graal 将使用 JDK 9 中引入的 JVM 编译器接口 (JVMCI)。Graal 已经在 JDK 中,因此将其作为实验性 JIT 启用将主要是测试和调试工作。
要启用 Graal 作为 JIT 编译器,请在 java 命令行上使用以下选项:
-XX:+UnlockExperimentalVMOptions -XX:+UseJVMCICompiler
Graal 是从头开始用 Java 完全重写 JIT 编译器。以前的 JIT 编译器是用 C++ 编写的。
11. Thread-Local握手
这个 JEP 为提高 VM 性能奠定了基础,它可以在应用程序线程上执行回调,而无需执行全局 VM 安全点。这意味着 JVM 可以停止单个线程,而不仅仅是所有线程。
线程本地握手最初将在 x64 和 SPARC 上实现。其他平台将退回到正常的安全点。一个新的产品选项-XX:ThreadLocalHandshakes
(默认值true
)允许用户在支持的平台上选择正常的安全点。
12. 删除 Native-Header 生成工具
它将javah
从 JDK 中删除该工具,这是一个在编译 JNI 代码时生成头文件的单独工具,因为这可以通过javac
.
这是 Java 10 的另一个专注于内务管理的特性。
13. 新增的API
Java 10 中添加了 73 个新的 API。让我们来看看其中的几个:
API | 描述 |
---|---|
Optional.orElseThrow() |
orElseThrow 类中添加了一个新方法Optional 。它是现有方法的同义词,现在是现有方法的首选替代get 方法。 |
List.copyOf , Set.copyOf , 和Map.copyOf |
这些方法从现有实例创建新的集合实例。 |
Collectors.toUnmodifiableList , Collectors.toUnmodifiableSet ,Collectors.toUnmodifiableMap |
这些方法允许将 a 的元素Stream 收集到不可修改的集合中 |
--jdk.disableLastUsageTracking |
为正在运行的 VM 禁用 JRE 上次使用跟踪。 |
--add-stylesheet |
支持在生成的文档中使用多个样式表。 |
--main-stylesheet |
帮助区分主样式表和任何附加样式表。 |
@summary 标签 |
添加以明确指定用作 API 描述摘要的文本。默认情况下,API 描述的摘要是从第一句话推断出来的。 |
14. 删除的API
API | 描述 |
---|---|
LookAndFeels |
|
Runtime.getLocalizedInputStream ,Runtime.getLocalizedOutputStream |
过时的国际化机制的一部分,没有已知用途。 |
RMI 服务器端多路复用协议支持 | 它在 JDK 9 中被禁用,现在已被删除。 |
常见的 DOM API | 和API 已被删除com.sun.java.browser.plugin2.DOM 。sun.plugin.dom.DOMObject 应用程序可以netscape.javascript.JSObject 用来操作 DOM。 |
平面轮廓仪 | 在 JDK 9 中已弃用,已通过删除实现代码而过时。 |
-Xoss , -Xsqnopause , -Xoptimize , -Xboundthreads , 和-Xusealtsigs |
已删除选项。 |
policytool |
policytool安全工具已从 JDK 中删除。 |
不推荐使用的类com.sun.security.auth.** |
现在删除以下课程。com.sun.security.auth.PolicyFile``com.sun.security.auth.SolarisNumericGroupPrincipal``com.sun.security.auth.SolarisNumericUserPrincipal``com.sun.security.auth.SolarisPrincipal``com.sun.security.auth.X500Principal``com.sun.security.auth.module.SolarisLoginModule``com.sun.security.auth.module.SolarisSystem |
总体而言,Java 10 有许多我们可能不会在日常编程中使用的特性,但它仍然有许多在幕后工作的特性使其成为重要的里程碑。