伊成博客
伊成博客

Java 10的功能和增强功能

“BeanUtils.copyProperties()用法及区别”

摘要

在Java 9发布之后,Java 10很快就出现了。与之前的版本不同,Java 10没有那么多令人兴奋的功能,但它几乎没有重要的更新可以改变您的编码方式,以及其他未来的Java版本。

JEP 286:局部变量类型推断

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

Application.java

1
2
3
4
5
6

var str = "Hello world";

//or

String str = "Hello world";

在上面的例子中,两个语句都是等价的。在第一个语句中,类型str由类型的赋值String类型决定。

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

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

$FEATURE.$INTERIM.$UPDATE.$PATCH

与旧版本不同,新的基于时间的版本不会延迟,功能将每六个月发布一次,不会限制版本中的功能。

还有长期版本(LTS)。它主要面向企业客户。LTS版本的产品将提供Oracle的一流和持续支持,并将每三年定位一次。此外,这些版本的更新将至少提供三年。

JEP 304:垃圾收集器接口

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

这纯粹是重构。以前工作的所有东西都需要在之后工作,性能不应该回归。

JEP 307:G1的并行全GC

Java 9引入了G1(垃圾优先)垃圾收集器。G1垃圾收集器旨在避免完整集合,但是当并发集合无法足够快地回收内存时。通过此更改,将发生后退完整GC。

G1的完整GC的当前实现使用单线程标记 - 扫描 - 紧凑算法。此更改将并行化mark-sweep-compact算法并使用相同数量的线程。当收集的并发线程无法足够快地恢复内存时,它将被触发。

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

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

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

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

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

作为此更改的一部分,JDK林的大量存储库被组合到单个存储库中,以简化和简化开发。

在JDK 9有八个回购:root,corba,hotspot,jaxp,jaxws,jdk,langtools,和nashorn。在统一林中,Java模块的代码通常组合在单个顶级src目录下。例如,今天在JDK林中有基于模块的目录,如

1
2
3
4
$ ROOT/JDK/src/java.base
...
$ ROOT/langtools/src/java.compiler
...

在整合的林中,此代码组织为 -

1
2
3
$ ROOT/src/java.base
$ ROOT/src/java.compiler
...

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

此功能的目标是改善启动占用空间,扩展现有的类 - 数据共享(“CDS”)功能,以允许将应用程序类放在共享存档中。

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

目前,CDS仅允许引导类加载器加载存档类。Application CDS允许内置系统类加载器,内置平台类加载器和自定义类加载器来加载归档类。

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

JEP 314:其他Unicode语言标记扩展

它的目标是增强java.util.Locale和相关的API,以实现BCP 47语言标签的其他Unicode扩展。最初在Java SE 7中添加了对BCP 47语言标记的支持,支持Unicode语言环境扩展仅限于日历和数字。此JEP将在相关的JDK类中实现最新LDML规范中指定的更多扩展。

此JEP将添加对以下附加扩展的支持:

  • cu (currency type)
  • fw (first day of week)
  • rg (region override)
  • tz (time zone)

修改后的相关API包括:

1
2
3
4
5
6
7
8
9
10
11
12
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根CA程序的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:线程局部握手

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

线程局部握手最初将在x64和SPARC上实现。其他平台将回归正常的安全点。新产品选项-XX:ThreadLocalHandshakes(默认值true)允许用户在支持的平台上选择正常安全点。

JEP 313:删除Native-Header生成工具

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

这是另一个Java 10功能,专注于内务管理。

新增的API和选项
在Java 10中添加了73个新的API。让我们来看看它们中的一些:

API 描述
Optional.orElseThrow() A new method orElseThrow has been added to the Optional class. It is synonymous with and is now the preferred alternative to the existing get method.
List.copyOf, Set.copyOf, and Map.copyOf These methods create new collection instances from existing instances.
Collectors.toUnmodifiableList,Collectors.toUnmodifiableSet,Collectors.toUnmodifiableMap These methods allow the elements of a Stream to be collected into an unmodifiable collection
–jdk.disableLastUsageTracking To disable JRE last usage tracking for a running VM.
–add-stylesheet Provides support for the use of multiple stylesheets in the generated documentation.
–main-stylesheet To help distinguish the main stylesheet from any additional stylesheets.
@summary Tag Added to explicitly specify the text used as the summary of the API description. By default, the summary of an API description is inferred from the first sentence.

删除了API和选项

API 描述
LookAndFeels
Runtime.getLocalizedInputStream, Runtime.getLocalizedOutputStream Part of an obsolete internationalization mechanism and have no known uses.
RMI Server-Side Multiplex Protocol Support It was disabled in JDK 9 and, now, has been removed.
Common DOM APIs The com.sun.java.browser.plugin2.DOM, and sun.plugin.dom.DOMObject APIs have been removed. Applications can use netscape.javascript.JSObject to manipulate the DOM.
FlatProfiler Deprecated in JDK 9, has been made obsolete by removing the implementation code.
-Xoss, -Xsqnopause, -Xoptimize, -Xboundthreads, and -Xusealtsigs Options removed.
policytool The policytool security tool has been removed from the JDK.
Deprecated Classes in com.sun.security.auth.** Following classes are removed now 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具有许多我们可能不会在日常编程中使用的功能,但它仍然具有许多功能,这些功能在幕后工作以使其成为重要的里程碑。

支付宝打赏 微信打赏

如果本文对你有所帮助,请打赏 1元就足够感动我 :)