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

JEP 286:局部变量类型推断

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

var str = "Hello world";
 
//or
 
String str = "Hello world";

在上面的示例中,两个语句都是等效的。在第一个语句中, str 的类型由赋值类型确定,而赋值的类型为 String 类型。

JEP 322:发行版本控制

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

$FEATURE.$INTERIM.$UPDATE.$PATCH

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

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

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林中,存在基于模块的目录,例如

$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 语言标签。最初在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 317: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 313:删除javah工具

它将从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和选项

APIDescription
LookAndFeels
Runtime.getLocalizedInputStream, Runtime.getLocalizedOutputStream已过时的国际化机制的一部分,并且没有已知用途。
RMI Server-Side Multiplex Protocol Support它已在JDK 9中禁用,现在已被删除。
Common DOM APIscom.sun.java.browser.plugin2.DOM和sun.plugin.dom.DOMObject API已被删除。应用程序可以使用netscape.javascript.JSObject来操作DOM。
FlatProfiler在JDK 9中已弃用,已通过删除实现代码来作废。
-Xoss, -Xsqnopause, -Xoptimize, -Xboundthreads, and -Xusealtsigs选项已删除。
policytool从JDK中删除了policytool安全工具。
Deprecated Classes in 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具有许多我们日常编程中可能不会使用的函数,但它仍有许多函数在幕后发挥作用,使其成为重要的里程碑。

学习愉快!

这一章你学到了什么?来做个笔记,好记忆不如烂笔头! 如果觉得对您有帮助,麻烦帮分享给您的朋友😊😊

祝学习愉快!(如果觉得不正确,选中要修改的内容->右键->编辑)

点我分享笔记