# Java 10 特性和增强特性

> 原文： [https://howtodoinjava.com/java10/java10-features/](https://howtodoinjava.com/java10/java10-features/)

在 [Java 9](https://howtodoinjava.com/java9/java9-new-features-enhancements/) 发布之后，Java 10 很快问世。 与以前的版本不同，Java 10 并没有那么多令人兴奋的特性，但仍然没有几个重要的更新会改变您的编码方式以及其他将来的 Java 版本。

```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 中开发人员唯一真正的特性。

```java
var str = "Hello world";

//or

String str = "Hello world";

```

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

> 阅读更多： [Java `var` – 局部变量类型推断](https://howtodoinjava.com/java10/var-local-variable-type-inference/)

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

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

```java
$FEATURE.$INTERIM.$UPDATE.$PATCH
```

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

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

> 阅读更多： [Java 版本 – 基于时间的发行版本控制](https://howtodoinjava.com/java10/java-version/)

## 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 中，有八个存储库：`root`，`corba`，`hotspot`，`jaxp`，`jaxws`，`jdk`，`langtools`和`nashorn`。 在统一森林中，通常将 Java 模块的代码合并在单个顶级`src`目录下。 例如，今天在 JDK 森林中，存在基于模块的目录，例如

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

在合并林中，此代码改为组织为：

```java
$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](https://www.rfc-editor.org/rfc/bcp/bcp47.txt) 语言标签的其他 Unicode 扩展。 最初在 Java SE 7 中添加了对 BCP 47 语言标签的支持，并且对 Unicode 语言环境扩展的支持仅限于日历和数字。 该 JEP 将在相关的 JDK 类中实现最新的 [LDML 规范](https://www.unicode.org/reports/tr35/tr35.html#Locale_Extension_Key_and_Type_Data)中指定的更多扩展。

该 JEP 将增加对以下附加扩展的支持：

*   cu（货币类型）
*   fw（一周的第一天）
*   rg（区域替代）
*   tz（时区）

修改后的相关 API 为：

```java
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 命令行上使用以下选项：

```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.copyOf`，`Set.copyOf`和`Map.copyOf` | 这些方法从现有实例创建新的集合实例。 |
| `Collectors.toUnmodifiableList`，`Collectors.toUnmodifiableSet`，`Collectors.toUnmodifiableMap` | 这些方法允许将`Stream`的元素收集到不可修改的集合中 |
| `--jdk.disableLastUsageTracking` | 要为正在运行的 VM 禁用 JRE 上次使用情况跟踪。 |
| `--add-stylesheet` | 在生成的文档中提供对使用多个样式表的支持。 |
| `--main-stylesheet` | 为了帮助将主要样式表与任何其他样式表区分开。 |
| `@summary` | 添加以明确指定用作 API 描述摘要的文本。 默认情况下，从第一句话推断出 API 描述的摘要。 |

## 删除的 API 和选项

| API | 描述 |
| --- | --- |
| `LookAndFeels` |  |
| `Runtime.getLocalizedInputStream`，`Runtime.getLocalizedOutputStream` | 已过时的国际化机制的一部分，并且没有已知用途。 |
| RMI 服务器端多路复用协议支持 | 它已在 JDK 9 中禁用，现在已被删除。 |
| 常见的 DOM API | `com.sun.java.browser.plugin2.DOM`和`sun.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.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 具有许多我们日常编程中可能不会使用的特性，但是它仍然具有许多在幕后起作用的特性，从而使其成为重要的里程碑。

学习愉快！