Java 10是其23年历史上最快的Java版本版本。Java一直受到批评,因为它的增长和进化缓慢,但Java 10刚刚破坏了这个概念。Java 10是一个带有许多未来变化的版本,其范围和影响可能并不明显,但令人难以置信。
长期支持模式
从2017年开始,Oracle和Java社区宣布将其转向Java的新6个月期限。它转向了Oracle Java SE产品的长期支持(LTS)模型。 **这意味着什么?**产品LTS版本将从Oracle提供首席和持续的支持,它将每3年针对。每个Java版本都经过一个或两个主要功能的模型,这些功能驱动了发布。任何障碍都会推迟发布并迟到市场。Project Jigsaw是Java 9的一个主要功能,它推迟了发布日期几次,发布时间延迟了超过1.5年。6个月的频率发布将跟随一个发布列车。发布列车将每6个月有一个时间表。功能使切片板在火车上;否则他们等待下一个计划的列车。
Oracle JDK 对 Open JDK
为了更方便开发者,Oracle & Java社区现在将OpenJDK二进制作为初级JDK前进. 这是前些年的一次大解脱,JDK二进制是正当的,并得到甲骨文的许可,对再分配有各种限制. 然而,甲骨文会继续生产他们的JDK,但只用于长期支持释放. 这是向更方便云和容器的转变,因为开放的JDK二进制可以作为容器的一部分来分发. 这是什么意思? 开放的JDK二进制会每6个月发布一次,而Oracle JDK二进制会每3年发布一次(LTS版本). ** 将采用哪一个JDK二进制? ** 大型组织需要时间才能在版本之间移动;它们坚持到它们能够移动为止。 Java 6的工业收养超过了Java 7,然后工业逐渐转移到[Java 8](/community/tourises/java-9-features- with-examples). 我认为,LTS版本将是企业最优惠的版本. 然而,无论是Oracle JDK的LTS版本,还是开放的JDK,目前还不知道,部分原因是云空间上发生了很多事. [Java 9] (/community/tourics/java-9-features- with-examples) & 10是非LTS发行. Java 11应于2018年9月发布,将发布LTS.
Java 10 功能
让我们来看看Java 10中可用的功能。
基于时间的发布版本(JEP 322)
随着基于时间的发布周期的通过,甲骨文更改了Java SE平台和JDK的版本字符串方案,以及相关的版本信息,用于当前和未来基于时间的发布模式. 版本号的新模式是:`$FEATURE. 钱。 $UPDATE(英语:UPDate). $PACH ' $FEATURE :计数器将每6个月递增一次,并将基于专题发布版本,例如:JDK 10,JDK 11个 ** INTERIM:对含有相容的bug修正和增强但无相容变化的非地貌释放,计数器会进行递增. 通常,这将是零,因为6个月内不会有临时释放。 这为今后修订发行模式留有余地。 ** $UPDATE:将增加一个计数器,用于兼容的更新发布,以更新功能固定安全问题、回归和错误。 功能发布后一个月更新,之后每三个月更新一次。 2018年4月发布为JDK 10.0.1,7月发布为JDK 10.0.2等 #$PATCH**:对紧急发布会进行加分以固定关键问题. 新的API已经加入, 让我们看看;
1Version version = Runtime.version();
2version.feature();
3version.interim();
4version.update();
5version.patch();
现在,让我们来看看返回版本信息的Java Launcher:
1$ java -version
2java version "10" 2018-03-20
3Java(TM) SE Runtime Environment 18.3 (build 10+46)
4Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10+46, mixed mode)
版本编号格式是10
,因为没有其他计数,除了零。 发布日期被添加。 18.3 可以读取为 2018 年和 3 个月, build 10+46 是版本的 46 个 build 10. 对于假设的 build 93 的 JDK 10.0.1, build 将是 10.0.1+939. ### 本地变量类型引用(JEP 286)
Local-Variable Type Inference 是 Java 10 开发人员的最大新功能,它将类型推断添加到使用初始化器的本地变量声明中。
- 仅限于本地变量与初始化器
- 指数增强为循环或索引
- 本地宣布为循环
让我们来看看它的使用:
1var numbers = List.of(1, 2, 3, 4, 5); // inferred value ArrayList<String>
2// Index of Enhanced For Loop
3for (var number : numbers) {
4 System.out.println(number);
5}
6// Local variable declared in a loop
7for (var i = 0; i < numbers.size(); i++) {
8 System.out.println(numbers.get(i));
9}
您可以阅读更多关于它在我们专属的帖子上 java 10本地变量类型推断。
这个功能使得基于Java的JIT编译器"Graal"在Linux/x64平台上被用作实验性的JIT编译器. 这是迄今为止Java 10 特性列表中最未来的包含. Graal被引入了Java 9. 这是JIT编译器的替代品, 它是一个JVM的插件,这意味着JIT编译器没有被绑定在JVM上,并且它可以被动态地插入并被JVMCI遵守的任何其他插件所取代(Java-Level JVM编译器接口). 它还在java世界带来了Ahead of Time(AOT)汇编. 它还支持多语种语言翻译. 一个基于Just in Time 编译器的Java,用Java来将java字节代码转换为机器代码。
搞不清楚吗? 如果JVM是用爪哇语写的,那么你不需要JVM来运行JVM吗? JVM可以被编译为AOT,然后JIT编译器可以在JVM内部被使用来通过活代码优化来增强性能. Graal是JIT编译器从零开始在Java完全重写. 上一个 JIT 编译器是用 c++ 写的. 它被认为是任何编程语言进化的最后阶段。 您可以使用以下jvm参数切换到 Graal :
1-XX:+UnlockExperimentalVMOptions -XX:+UseJVMCICompiler
您可以从 Chris Seaton 演示 了解更多关于 Graal 的信息。
此功能有助于改善启动脚印,扩展现有的 Class-Data Sharing(CDS
)功能,允许应用程序类被放置到共享档案中。在启动时,JVM执行了一些初步步骤,其中之一是将类加载到内存中。如果有多个具有多个类的罐头,那么第一个请求的延迟是清晰可见的。这成为了无服务器架构的问题,其中启动时间至关重要。为了减少应用程序启动时间,可以使用应用程序类数据共享。 这个想法是通过在不同的Java流程中共享共同类元数据来减少足迹。 这可以通过以下3个步骤实现: 确定类来存档:使用Java Launcher来创建文件列表来存档,可以通过以下参数实现:
1$java -Xshare:off -XX:+UseAppCDS -XX:DumpLoadedClassList=hello.lst -cp hello.jar HelloWorld
** 创建 AppCDS 档案**:使用 java launcher 创建用于应用 CDS 的文件列表档案,可以通过以下参数实现:
1$java -Xshare:dump -XX:+UseAppCDS -XX:SharedClassListFile=hello.lst -XX:SharedArchiveFile=hello.jsa -cp hello.jar
** 使用 AppCDS 档案:使用以下参数的 Java 启动器来使用 Application CDS。
1$java -Xshare:on -XX:+UseAppCDS -XX:SharedArchiveFile=hello.jsa -cp hello.jar HelloWorld
G1 的平行全GC(JEP 307)
G1 垃圾收集器在JDK 9中被设置为默认值,G1垃圾收集器避免任何完整的垃圾收集,但当同步收集的线程无法恢复足够快的用户体验时,会受到影响。这种变化通过使完整的GC平行来提高G1最差的情况的延迟性。G1垃圾收集器的标记扫描小算法作为此变化的一部分被平行化,并且在同步收集的线程无法足够快地恢复记忆时会被触发。 ###垃圾收集器接口(JEP 304)
它通过引入一个共同的垃圾收集器接口来改善不同垃圾收集器的代码隔离,这项变化为内部GC代码提供了更好的模块化性,在未来将有助于在不改变现有代码库的情况下添加新的GC,还有助于删除或维护以前的GC26。 ### 额外的Unicode语言标签扩展(JEP 314)
此功能增强了 java.util.Locale 和相关的 API,以实现 BCP 47 语言标签的额外 Unicode 扩展. 从 Java SE 9 开始,支持的 BCP 47 U 语言标签扩展为ca
和nu
。
- cu (货币类型)
- fw (周的第一天)
- rg (区域翻译)
- tz (时区)
为了支持这些附加扩展,对各种 API 进行更改,以提供基于 U 或附加扩展的信息。
1java.text.DateFormat::get*Instance
2java.text.DateFormatSymbols::getInstance
3java.text.DecimalFormatSymbols::getInstance
4java.text.NumberFormat::get*Instance
5java.time.format.DateTimeFormatter::localizedBy
6java.time.format.DateTimeFormatterBuilder::getLocalizedDateTimePattern
7java.time.format.DecimalStyle::of
8java.time.temporal.WeekFields::of
9java.util.Calendar::{getFirstDayOfWeek,getMinimalDaysInWeek}
10java.util.Currency::getInstance
11java.util.Locale::getDisplayName
12java.util.spi.LocaleNameProvider
根证书(JEP 319)
为了促进OpenJDK并使其对社区用户更具吸引力,该功能在JDK中提供了默认的 root Certification Authority(CA)证书集,这也意味着Oracle和Open JDK二进制在功能上将是相同的。
这是一个改进性能的内部 JVM 功能。 手动操作是对每个 JavaThread 执行的回调,而该线程处于安全点状态。 回调是由线程本身或 VM 线程执行的,同时保持线程处于封锁状态。 此功能提供了在不执行全球 VM 安全点的情况下对线程执行回调的方式。 使单个线程的阻止既可能又便宜,而不仅仅是所有线程或没有。
应用程序已成为内存饥饿,云本地应用程序、内存数据库、流应用程序的数量增加。为了满足这些服务,有各种内存架构可用。此功能增强了HotSpot VM在用户指定的NV-DIMM等替代内存设备上分配Java对象堆积的能力。该JEP针对具有与DRAM相同语义学的替代内存设备,包括原子操作的语义学,因此可以用来代替DRAM对象堆积,而无需更改现有应用程序代码。 ###删除Native-Header Generation Tool – javah (JEP 313)
这个工具功能被添加到javac
作为JDK 8的一部分,它提供了在编译时编写本地标题文件的能力,使javah
无用。
多年来, JDK 代码库中存在各种 Mercurial 存储库。不同的存储库确实提供了一些优势,但它们也有各种运营缺点。 作为这一变化的一部分,JDK 森林的众多存储库被合并为一个单一的存储库,以简化和简化开发。
Java 10 已添加并删除 (Yes It’s not a Typo) API. Java 9 引入了增强的贬值,其中某些 API 被标记为在未来版本中被删除。
- 列表、地图和设置接口被添加以静态复制Of(收藏)方法. 它返回一个不可修改的列表,地图或集包含所提供的条目. 对于列表,如果给定的列表被修改后,返回的列表不会反映这样的修改.
- 可选和其原始的变异得到一种方法或ElseThrow(). 这是完全相同的 Get(),但是Java 文档表示它是一个偏好的替代,然后得到()
- 收藏家类获得各种方法收集不可修改的集合(Set, List, Map)
1List<String> actors = new ArrayList<>();
2actors.add("Jack Nicholson");
3actors.add("Marlon Brando");
4System.out.println(actors); // prints [Jack Nicholson, Marlon Brando]
5// New API added - Creates an UnModifiable List from a List.
6List<String> copyOfActors = List.copyOf(actors);
7System.out.println(copyOfActors); // prints [Jack Nicholson, Marlon Brando]
8// copyOfActors.add("Robert De Niro"); Will generate an
9// UnsupportedOperationException
10actors.add("Robert De Niro");
11System.out.println(actors);// prints [Jack Nicholson, Marlon Brando, Robert De Niro]
12System.out.println(copyOfActors); // prints [Jack Nicholson, Marlon Brando]
13
14String str = "";
15Optional<String> name = Optional.ofNullable(str);
16// New API added - is preferred option then get() method
17name.orElseThrow(); // same as name.get()
18
19// New API added - Collectors.toUnmodifiableList
20List<String> collect = actors.stream().collect(Collectors.toUnmodifiableList());
21// collect.add("Tom Hanks"); // Will generate an
22// UnsupportedOperationException
结论
在本文中,我们通过了Java的不同新功能添加 10. 如果您认为这里错过了任何重要的东西,请通过评论告诉我们. 像往常一样,您可以在GitHub检查完整的代码。