随着JavaDevelopmentKit(JDK)9的发布,很多注意力都集中在Java的最新特性上,包括模块的引入(通过集成项目Jigsaw).虽然最近的大部分注意力都集中在这些强大的新功能上,但下一个Java版本:JDK10的准备工作已经开始。在本文中,我们将简要介绍JDK10的主要特性,并探索JDK10中可能包含的一些特性。请注意,本文中包含的信息在撰写本文时是准确的。但到发布时,JDK10的功能集有望增加。新功能与以前的JDK版本一样,即将发布的JDK10也有一些主要功能。这些功能可以分为两大类:(1)目标版本,和(2)提议版本。前者表示某些特性计划在JDK10中发布,后者表示这些特性还需要增加支持和成熟度。一旦条件允许,可以提升为目标发布状态。目标版本目前对JDK10有两个主要特性:局部变量类型推断,它将去除冗长的包含大多数对象实例化所需的手动类型信息的JDK库,并整合源代码树,即将不同的JDK库合并成一个单个存储库。1.局部变量类型推断强类型编程语言有很多优点,包括在编译时发现类型错误,但它们也引入了很多样板代码,尤其是在定义局部变量时。例如,当我们希望实例化一个对象时,我们被迫在赋值的左侧提供显式类型,在赋值的右侧提供实现类型,如以下代码片段所示:MyObjectvalue=newMyObject();但是,当过程重复大量任务时,此Object实例化会变得令人沮丧和乏味。许多最流行的强类??型编程语言,例如C++、C#和Go,都在定义过程中提供了局部变量类型推断的功能(例如C++提供了auto关键字,C#提供了var关键字)。然而,Java仍然缺乏这样的功能,这需要开发人员显式声明变量的预期列表类型。为了解决这个问题,JavaDevelopmentKit(JDK)ImprovementProposal(JEP)286提出了上下文相关的关键字var,允许局部变量以如下方式初始化:varvalue=newMyObject();varlist=newArrayList();由于var关键字是上下文相关的,其使用由以下规则定义:使用var作为变量、方法或包名的代码不会受到影响;使用var作为类或接口名称的代码将受到影响。同样,类型推断将受到以下方式的约束:推断类型将仅限于局部变量的初始化、增强型for循环中的索引和传统for循环中的声明;它(将)不会用于方法形式、构造函数形式、方法返回类型、字段、捕获形式或任何其他类型的变量声明。考虑到所有限制和细微差别,此功能将有助于减轻开发人员创建的应用程序Java代码中的许多繁琐操作,并简化JDK代码库。更多信息可以在官方JEP286规范中找到。2.集成的JDK存储库目前,有8个不同的Mercurial存储库用于存储包含JDK的大量源代码:rootcorbahotspotjaxpjaxwsJDKlangtoolsnashorn清晰的分离,但是管理多个存储库有一些主要的缺点。其中最重要的是,无法在JDK的两个不同部分中自动跟踪单个错误修复。例如,如果错误修复需要更改包含在不同存储库中的系统的两个部分,则必须提交两次提交:每个存储库一个。这种不连续性很容易降低项目和源代码控制工具的可追溯性和复杂性。为了解决这个问题,JEP296建议将所有现有存储库合并到一个Mercurial存储库中。这种合并的一个副作用是,这个单一的Mercurial存储库比现有的8个存储库更容易镜像(作为Git存储库)。虽然在这个集成过程中有来自外部开发人员的一些阻力,但JDK开发团队似乎已承诺将此更改作为JDK10的一部分。有关更多信息,请参阅JEP296并发布集成JDK10OpenJDKMercurial存储库公告的提案迈克尔·雷德利希(MichaelRedlich)着。ProposedRelease除了这两个目标特性之外,JDK10目前还有三个提案,其中两个主要是升级JDK的垃圾收集器部分,另一个重点是升级JDK的原生线程功能。1.清理垃圾收集接口在当前的JDK结构中,构成垃圾收集器(GC)实现的组件分散在代码库的各个部分。尽管使用GC计划的JDK开发人员熟悉这些约定,但新开发人员通常会对特定GC的源代码或创建新的GC感到困惑。更重要的是,随着Java模块的出现,我们希望在构建过程中排除不必要的GC,但当前GC接口的横切结构排除了这种增强。JEP304就是为了解决这个问题而设计的,并提出合并和清理GC接口,以便新的GC更容易实现并更好地维护现有的GC。完成此通知后,GC实现将负责提供以下内容:heap,CollectedHeap屏障集的子类,BarrierSet的子类,它在运行时实现各种屏障CollectorPolicy的实现GCInterpreterSupport的实现,它实现了解释器的GC的各种障碍(使用汇编指令)GCC1Support的实现,它为C1编译器实现了GC的各种障碍GCC2Support的实现,它为C2编译器实现了GC的各种障碍最终GC特定参数的初始化MemoryService,相关的内存池,内存管理器等。有关这些更改的更多信息,请参阅JEP304规范;有关JavaGC的更多信息,请参阅Oracle提供的垃圾收集器基础指南。2.G1垃圾收集器并行化随着JDK9的发布,Garbage-First(G1)GC取代了ParallelCollector作为默认GC。为了减少JDK9以外的JDK版本中垃圾收集的影响,G1收集器将被并行化(以匹配并行收集器的特性)。虽然目前没有关于此并行化实现细节的信息,但可以在JEP307规范中找到有关此更改的更多详细信息。有关GC实施的更多信息,请参阅Oracle的G1指南和并行收集器指南。3.项目线程本地握手目前,停止Java线程是一个“全有或全无”的过程,需要Java虚拟机(JVM)的安全点才能停止线程。为了让单个线程停止,JEP312提议将回调包含到线程中。这种变化是有限的,因为它显着增加了现有JVM功能的性能开销,并改变了现有的时序语义以达到JVM全局安全点。有关此提议的更多信息,请参阅JEP312的Thread-LocalHandshakeOpenJDK讨论。结束语尽管JDK9对于许多Java开发人员来说是一个全新的事物,但它的发展并未停止。特别是,JDK10承诺引入用于局部变量实例化的类型推断机制,并将现有的JDK存储库合并到单个Mercurial存储库中。此外,当更加成熟和受支持时,JDK10还可能包括对GC接口和默认GC实现的一些重要升级,以及JVM中的单线程寻址能力。虽然JDK10的发布还比较遥远,但其中包含的功能很可能成为Java时间轴上的一个重要里程碑。
