Java 10 特性和增强特性

Java 10 特性和增强特性

原文: https://howtodoinjava.com/java10/java10-features/

Java 9 发布之后,Java 10 很快问世。 与以前的版本不同,Java 10 并没有那么多令人兴奋的特性,但仍然没有几个重要的更新会改变您的编码方式以及其他将来的 Java 版本。

Table of Contents

JEP 286: Local Variable Type Inference
JEP 322: Time-Based Release Versioning
JEP 304: Garbage-Collector Interface
JEP 307: Parallel Full GC for G1
JEP 316: Heap Allocation on Alternative Memory Devices
JEP 296: Consolidate the JDK Forest into a Single Repository
JEP 310: Application Class-Data Sharing
JEP 314: Additional Unicode Language-Tag Extensions
JEP 319: Root Certificates
JEP 317: Experimental Java-Based JIT Compiler
JEP 312: Thread-Local Handshakes
JEP 313: Remove the Native-Header Generation Tool
New Added APIs and Options
Removed APIs and Options

JEP 286:局部变量类型推断

Java 现在具有var样式声明。 它允许您声明局部变量而无需指定其类型。 变量的类型将从创建的实际对象的类型推断出来。 它声称是 JDK 10 中开发人员唯一真正的特性。

var str = "Hello world";

//or

String str = "Hello world";

在上面的示例中,两个语句都是等效的。 在第一句话中,str的类型由分配类型String的类型确定。

阅读更多: Java var – 局部变量类型推断

JEP 322:基于时间的发行版本控制

从 Java 10 开始,Oracle 调整了基于时间的版本字符串方案。 版本号的新格式为:

$FEATURE.$INTERIM.$UPDATE.$PATCH

与旧版本不同,新的基于时间的版本不会延迟,并且特性将每六个月发布一次,并且对发布中的哪些特性没有限制。

也有长期发行(LTS)。 它主要针对企业客户。 LTS 版本的产品将提供 Oracle 的首要和持续的支持,目标是每三年一次。 此外,这些版本的更新将至少提供三年。

阅读更多: Java 版本 – 基于时间的发行版本控制

JEP 304:垃圾收集器接口

在早期的 JDK 结构中,构成垃圾收集器(GC)实现的组件分散在代码库的各个部分。 它已在 Java 10 中进行了更改。现在,它是 JVM 源代码中的一个干净接口,可以快速轻松地集成替代收集器。 它将改善不同垃圾收集器的源代码隔离。

这纯粹是重构。 之前工作的所有内容都需要事后进行工作,并且性能不应降低。

JEP 307:用于 G1 的并行全 GC

Java 9 引入了 G1(垃圾优先)垃圾收集器。 G1 垃圾收集器的设计避免了完整的收集,但是当并发收集不能足够快地回收内存时。 进行此更改后,将发生后备完整 GC。

G1 的完整 GC 的当前实现使用单线程的 mark-sweep-compact 算法。 此更改将使 mark-sweep-compact 算法并行化,并使用相同数量的线程。 当用于收集的并发线程无法足够快地恢复内存时,将触发该事件。

线程数可以通过-XX:ParallelGCThreads选项控制。

JEP 316:备用存储设备上的堆分配

进行此更改的目的是使 HotSpot VM 能够在用户指定的备用存储设备(例如 NV-DIMM)上分配 Java 对象堆。

要在此类内存中分配堆,我们可以添加一个新选项-XX:AllocateHeapAt=<path>。 该选项将采用文件系统的路径,并使用内存映射来实现在存储设备上分配对象堆的预期结果。 现有的与堆相关的标志,例如-Xmx-Xms等,以及与垃圾回收相关的标志将继续像以前一样工作。

JEP 296:将 JDK 森林整合到单个存储库中

作为此更改的一部分,为了简化和简化开发,将 JDK 森林的许多存储库合并到一个存储库中。

在 JDK 9 中,有八个存储库:rootcorbahotspotjaxpjaxwsjdklangtoolsnashorn。 在统一森林中,通常将 Java 模块的代码合并在单个顶级src目录下。 例如,今天在 JDK 森林中,存在基于模块的目录,例如

$ROOT/jdk/src/java.base
...
$ROOT/langtools/src/java.compiler
...

在合并林中,此代码改为组织为:

$ROOT/src/java.base
$ROOT/src/java.compiler
...

JEP 310:应用程序类 - 数据共享

此特性的目标是改善启动范围,扩展现有的类数据共享(“ CDS”)特性,以允许将应用程序类放置在共享档案中。

JDK 5 中引入的类数据共享允许将一组类预处理为共享的存档文件,然后可以在运行时对其进行内存映射以减少启动时间。 当多个 JVM 共享同一个存档文件时,它还可以减少动态内存占用。

当前,CDS 仅允许引导类加载器加载归档的类。 应用程序 CDS 允许内置系统类加载器,内置平台类加载器和自定义类加载器加载归档的类。

指定-XX:+UseAppCDS命令行选项可为系统类加载器,平台类加载器和其他用户定义的类加载器启用类数据共享。

JEP 314:其他 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

JEP 319:根证书

cacerts 密钥库是 JDK 的一部分,旨在包含一组根证书,这些根证书可用于建立对各种安全协议中使用的证书链的信任。 但是,JDK 源代码中的 cacerts 密钥库当前为空。

cacerts 密钥库将填充由 Oracle Java SE Root CA Program 的 CA 颁发的一组根证书。 许多供应商已经签署了所需的协议,并且每个供应商都将包含一份根证书列表。 那些没有签署协议的人目前不会包括在内。 下一个版本将包含处理时间较长的内容。

这也意味着两个 Oracle & Open JDK 二进制文件在特性上都相同。 以后,默认的 TLS 等关键安全组件将在 OpenJDK 构建中正常工作。

JEP 317:基于 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++编写的。

JEP 312:线程本地握手

通过使无需执行全局 VM 安全点就可以在应用程序线程上执行回调成为可能,该 JEP 为提高 VM 性能奠定了基础。 这意味着 JVM 可以停止单个线程,而不仅仅是所有线程。

线程本地握手将首先在 x64 和 SPARC 上实现。 其他平台将恢复到正常的安全点。 新的产品选项-XX:ThreadLocalHandshakes(默认值true)使用户可以在受支持的平台上选择常规安全点。

JEP 313:删除本机头生成工具

它将从 JDK 中删除javah工具,这是一个单独的工具,可在编译 JNI 代码时生成头文件,因为可以通过javac来完成。

这是 Java 10 的另一项着重于内务处理的特性。

新增的 API 和选项

Java 10 中添加了 73 个新 API。让我们来看看其中的几个:

API 描述
Optional.orElseThrow() 新方法orElseThrow已添加到Optional类。 它与现有的get方法同义,并且现在是它的首选替代方法。
List.copyOfSet.copyOfMap.copyOf 这些方法从现有实例创建新的集合实例。
Collectors.toUnmodifiableListCollectors.toUnmodifiableSetCollectors.toUnmodifiableMap 这些方法允许将Stream的元素收集到不可修改的集合中
--jdk.disableLastUsageTracking 要为正在运行的 VM 禁用 JRE 上次使用情况跟踪。
--add-stylesheet 在生成的文档中提供对使用多个样式表的支持。
--main-stylesheet 为了帮助将主要样式表与任何其他样式表区分开。
@summary 添加以明确指定用作 API 描述摘要的文本。 默认情况下,从第一句话推断出 API 描述的摘要。

删除的 API 和选项

API 描述
LookAndFeels  
Runtime.getLocalizedInputStreamRuntime.getLocalizedOutputStream 已过时的国际化机制的一部分,并且没有已知用途。
RMI 服务器端多路复用协议支持 它已在 JDK 9 中禁用,现在已被删除。
常见的 DOM API com.sun.java.browser.plugin2.DOMsun.plugin.dom.DOMObject API 已被删除。 应用程序可以使用netscape.javascript.JSObject来操作 DOM。
FlatProfiler 在 JDK 9 中已弃用,已通过删除实现代码来作废。
-Xoss-Xsqnopause-Xoptimize-Xboundthreads-Xusealtsigs 选项已删除。
policytool 策略工具安全工具已从 JDK 中删除。
com.sun.security.auth.**中不推荐使用的类 下面的类现在已移除:com.sun.security.auth.PolicyFilecom.sun.security.auth.SolarisNumericGroupPrincipalcom.sun.security.auth.SolarisNumericUserPrincipalcom.sun.security.auth.SolarisPrincipalcom.sun.security.auth.X500Principalcom.sun.security.auth.module.SolarisLoginModulecom.sun.security.auth.module.SolarisSystem

总体而言,Java 10 具有许多我们日常编程中可能不会使用的特性,但是它仍然具有许多在幕后起作用的特性,从而使其成为重要的里程碑。

学习愉快!