当前位置: 首页 > 科技观察

Java年轻:现状与技术趋势报告

时间:2023-03-12 19:54:17 科技观察

值此《Java 开发手册》泰山版发布之际,让我们一起总结思考Java的最新技术趋势与未来。本文将从JavaSE开源现状、OpenJDK版本生态、OpenJDK技术趋势三个方面描述Java基础技术现状,并进一步探讨支持Java应用在云原生、AI、多语言领域的基石生态——Java虚拟机(JVM)技术,面向未来的演进趋势。背景1991年,JamesGosling带领团队启动了一个名为“Oak”的项目,这就是Java的前身。1995年,Java1.0发布。Java的口号“Writeonce,runanywhere”想必大家都不陌生。Java刚出现的时候,主要是针对交互式电视领域的。直到后来几年的发展,SUN(后来在2010年被甲骨文收购)曾经想用Java打造一个桌面网络操作系统来替代当时风头正劲的Windows。然而,在Java后来的发展中,却不曾想,它虽然在桌面领域没有太大的作为,却意外地在企业应用领域开花结果,占据了今天几乎统治地位。东角已失,桑榆却收成。JavaSE开源现状在2006年的JavaOne大会上,Sun宣布了Java技术的开源,随后在2006年底发布了GPL协议下的HotSpot和javac,是Java发展的一个里程碑。阿里巴巴在2012年首先签署了OCA,并参与了OpenJDK的开发。OpenJDK是JavaSE的开源参考实现。在JavaOne2017(JavaOne于2018年被甲骨文更名为CodeOne)的Keynote上,甲骨文承诺开源OracleJDK中包含的所有商业实现功能[1]。在2018年发布的Java11中,Oracle已经让OpenJDK和OracleJDK的二进制文件在功能上尽可能接近,尽管OpenJDK和OracleJDK在某些选项上仍然存在一些差异[2]。此外,除了OpenJDK主线外,近年来Java基础技术的开源愈演愈烈:2017年,IBM开源了内部使用了20多年的J9虚拟机,贡献了它交给了Eclipse基金会,然后在2018年和2009年,Oracle开源了GraalVM1.0,其核心包括用Java编写的Just-in-Time编译器/Graal、SubstrateVM和支持多语言解释器的Truffle框架。各家企业开源的主要动机是通过开源构建更强大的语言生态系统并从中受益。云+开源的结合,让普通开发者能够以更低的门槛获得一流工具(链)的使用和体验。任何企业都可以使用与任何大型组织相同的技术(民主化)。黄金年龄。Java仍然免费:您应该选择哪种JDK?Java还是免费的,但是随着OracleJDKLicense的变化,开始收费,OpenJDK会逐渐取代OracleJDK成为市场的主流。这从JVM2020生态报告中也可以看出:OracleJDK从前一年70%的开发者选择使用下降到2020年的34%。OracleJDK收费也在客观上加剧了OpenJDK生态的碎片化趋势,并且有基于OpenJDK的多个可选实现,包括AlibabaDragonwell。企业在选择使用哪个JavaVendor的JDK版本时,可以考虑几个方面:安全稳定:是否会及时同步最新的上游更新,包括安全补丁、关键问题修复等JavaSEStandardCompliant:是否它与标准Java兼容。性能和效率:是否能在问题诊断和性能调优方面提供有效的工具支持,帮助一线开发人员高效解决Java问题。在JVM和JDK(类库)层面,是否有针对企业业务场景的优化特性,有助于提高资源利用率、生产系统的稳定性等。新技术的快速采用:在收费的同时,Oracle在管理Java版本生命周期方面采用了长期支持(LTS)的概念。Oracle会每三年指定一个LTSJava版本,Java8/11都是LTS版本。大多数企业,尤其是大中型企业,很难跟上Java每六个月发布一次的节奏,比如像Java12、13这样的FeatureRelease(FR)版本。那么问题来了,如果你选择留在LTS版本,比如Java11,新版本(Java11+)发布的JVM/JDK技术,不升级是否可以提前享受这些技术红利?分享一下AlibabaDragonwell在这些方面的规划和思考。AlibabaDragonwell是阿里巴巴内部广泛使用的AJDK(AlibabaJDK)开源版本。作为基石,AlibabaDragonwell支持阿里经济体中几乎所有的Java业务,并通过了双11等大促的考验。AlibabaDragonwell主要针对数据中心大规模Java应用部署情况下Java应用稳定性、效率、性能的优化和提升。2019年3月,阿里巴巴开源了AlibabaDragonwll8.0.0,我们一直在践行开源的承诺。AJDK内部使用的功能正在逐步开源。截至刚刚发布的AlibabaDragonwell8.3.3,我们已经开源了JWarmup、ElasticHeap、多租户、JFR等众多功能,协程Wisp2.0、GCIH等也在开源规划中.同时,AlibabaDragonwell是OpenJDK的下游,每次发布都会同步最新的上游更新,包括安全更新、bug修复等,并经过阿里巴巴内部大型应用集群的测试。在新技术采用方面,AlibabaDragonwell目前发布并维护着Java8和11两个LTS版本,AlibabaJVM团队会根据实际业务情况将Java11+相关功能移植到Java8和11中,让AlibabaDragonwell用户可以无需跟进Java12、13等这些FR版本,提前享受这些功能带来的技术红利。OpenJDK技术动向纵观Java技术20多年的发展,始终围绕着两大主题:Productivity和Performance。在许多情况下,Java在设计时考虑的是生产力而不是性能。Java引入的GarbageCollector将程序员从复杂的内存管理中解放出来,但另一方面Java应用程序总是受到GC停顿时间的影响。Java基于栈虚拟机的中间字节码设计,很好的抽象了不同平台(Intel、ARM等)的差异,通过Just-in-Time(JIT)编译解决了Java应用的峰值性能技术。但另一方面,JIT不可避免地引入了Warmup的成本。一般情况下,Java程序总是需要先加载类,解释执行,然后执行高度优化的代码。如果我们从JVM的角度来总结OpenJDK社区目前正在发生的事情,孵化出来的相关技术,主要是从工具、GC、编译器、Runtime四个方面:JFR/JMCOracle从Java11开始就已经开源了。被用作商业功能的JFR,JFR是一个强大的Java应用程序问题诊断和性能分析工具。阿里巴巴也是主要贡献者,与包括RedHat在内的社区一起,将JFR移植到OpenJDK8。预计2020年7月发布的OpenJDK8u262(Java8)将默认具备JFR功能,让Java8用户可以免费使用基于该版本的JFR功能。ZGC/Shandoath无论是Oracle在Java11中发布的ZGC,还是RedHat研究了几年的Shandoath,都是实现并发复制GC来解决LargeHeap情况下的GCshutdown性能问题。ZGC的最新状态,在9月份即将发布的JDK15版本中,ZGC将从Experimentalfunction变为productionavailability[3]。其实在AJDK11上,阿里巴巴团队的JVM团队已经做了很多ZGC从Java11+到Java11的移植,以及相关的问题修复。2019年双11和阿里巴巴数据库团队将让数据库应用运行在ZGC上,在100+GBHeap的情况下,GC停顿时间可以保持在<10ms以内。详细讨论参见[4]。Graal使用Java开发了新一代的Just-in-Time编译技术来替代目前的HostSotJVMC1/C2编译器。OpenJDK上的Ahead-of-Time(AOT)技术也是基于Graal编译器开发的。LoomOpenJDK社区协程项目,对应AJDK的Wisp2.0实现,详细讨论可参考[5]。进击Java:面对2020的未来演进,站在一个全新的节点上,本文也从云原生、AI、多语言生态三大方面展望了未来的发展。有些讨论超出了Java本身。的。面向云原生的语言演进云原生时代,软件的交付方式发生了根本性的变化。以Java为例,以往Java开发者交付应用本身,具体是“jar”和“war”的形式,而CloudNative则以Container作为交付单元:在运行上,CloudNativeApplication要求:ReactiveAlwaysWatching极低内存占用快速启动Java语言作为企业计算和互联网领域的王者,具有一致性、基于Java语言构建的丰富生态系统、丰富的三方库、多样化的Serviceability支持等,与云时代微服务的应用,Serverless,这些新架构逐渐触及了Java程序速度提升的天花板——Java自身的启动和运行开销。在CloudNative的新语境下,当我们谈论语言进化时,我们不再局限于运行时和编译器层面。新的计算形态必然伴随着编程模型的改变,涉及到围绕编程语言的Library、Framework、Tools等。一系列配套改革。从目前的行业来看,也有很多项目在进行:Quarkus、Micronaut、Helidon,与GraalVM/SVM(Java静态编译技术)配合的下一代编程框架,而且Quarkus甚至提出了“容器优先”。分层轻量级uber-jar的概念符合容器交付的趋势。RedHat的Java团队和OS团队的“CheckpointRestoreFastStart-up”技术(AZul在JVMTechnologySummit'2019上也提出了类似的想法)就是解决Java在更底层的技术栈上的快速上拉。问题。在JavaforCloudNative方向,我们也进行了相关的研发工作。Java是一门静态语言,但它包含了大量的动态特性,包括反射、类加载、字节码工具(BCI)等,这些动态特性本质上违背了GraalVM/SVM所要求的封闭世界假设(CWA)原则。这也是为什么传统上运行在JVM上的Java应用程序不容易在SVM上编译运行的主要原因。阿里巴巴JVM团队对AJDK进行了静态裁剪,目的是在Java的静态特性和动态特性之间找到一个明确的界限,从JDK层面为Java的静态编译提供可能。同时,我们将与ant中级团队合作,定义一个面向静态编译的Java编程模型,该模型受编程框架的约束——Java应用的开发对静态编译友好。我们基于蚂蚁开源中间件SOFAStack静态编译了服务注册中心的Meta节点应用。与传统的运行在JVM上相比,性能提升了一个数量级:服务启动时间减少了17倍,可执行文件的大小也减少了。3.4倍,运行时内存减少一半。有关详细信息,请参见[6]。AI的兴起,编程语言异构计算的新挑战2005年,时任英特尔CTO的JustinRattner说“我们正处于向多核、多线程架构过渡的风口浪尖”,过去十年,编程领域语言和编译器一直在努力优化和探索并行架构范式。随着近年来AI的兴起,不同时间节点和相似场景,面向FPGA/GPU异构计算场景,对编程语言和编译器领域提出了新的挑战。除了IBMXLCompilers、IntelCompilers等传统Compiler所做的AutomaticParallelizing工作外,在极限性能探索方面,基于多胞体模型的编译优化技术已经成为解决程序并行化和数据局部性优化的手段.编译器优化领域的研究热点。在ParallelLanguages层面,对于C&C++开发者来说,CUDA的出现降低了GPU编程的门槛,但是GPU和CPU这两种硬件模型的本质区别导致开发成本过高,需要学习和理解更多底层硬件细节。更不用说Java等高级语言的开发语言所面临的底层硬件模型与高级语言之间的巨大差距。在Java领域,在JVMTechnologySummit'2014上,AMD曾分享过他们的Sumatra项目,试图实现JVM与HeterogeneousSystemArchitecture目标硬件的交互。最近,由曼彻斯特大学发起的TornadoVM项目实现了:支持从Java字节码映射到OpenCL的即时编译,优化的运行时引擎,以及维护Java堆和异构设备的能力堆的内存管理器记忆一致性。TornadoVM的目标是开发者可以在不了解GPU编程语言或相关GPU架构知识的情况下编写异构并行程序。TornadoVM可以在AMDGPU、NVIDIAGPU、Intel集成GPU和多核CPU上透明运行。在通用CPU领域,OpenJDK社区的VectorAPI项目(巴拿马的一个子项目)就是依靠CPU的SIMD指令实现了计算性能的翻倍。VectorAPI在大数据和AI计算方面也有非常广泛的应用场景。阿里巴巴JVM团队将VectorAPI移植到AJDK11中,后续将开源给AlibabaDragonwell。分享一下我们得到的基本性能数据:时间越短(单位:毫秒),性能越好。一个新概念。在ManagedRuntime领域,IBM在2017年开源了OpenManagedRuntime(OMR),Oracle在2018年开源了Truffle/Graal技术。OMR和Graal技术使开发人员实现新语言的成本大大降低。前者OMR以C和C++组件的形式提供垃圾回收(GC)、准时化(JIT)和可靠性、可用性和可服务性(RAS、工具)。开发者可以依托这些组件,通过“胶水”的方式实现自己的基于这些组件的高性能语言。后者就是Truffle/Graal,Truffle是一个依赖AST解析器实现新语言的Java框架,本质上是将你的新语言映射到JVM世界。不同于Scala、JRuby,围绕JVM生态系统本身构建的语言,它们本质上仍然是Java。无论是OMR,还是Truffle/Graal,都提供生产级的GC、JIT、RAS服务支持。新开发的语言完全不需要重新实现这些底层技术。从行业的角度来看,针对特定领域的领域特定语言(DomainSpecificLanguage,DSL)有向这些技术迁移的趋势。GoldmanSachs正在与Graal社区合作,将他们的DSL迁移到Graal。此外,真正链接不同语言生态的Ruby/OMR、Python/Graal、JS/Graal、WASM/Graal等项目也在快速发展。回到AJDK,在AJDK8中已经支持Graal,并且在阿里内部业务中推出了JS/Graal等成熟技术。说到底,Java是20多年前发明的技术。她历经磨难,几经易主,却历久弥新。本报告旨在为Java开发者梳理Java技术现状,探讨Java技术在云、AI等重要领域的演进趋势。在介绍的相关部分,我们也穿插了一些阿里的工程实践。作为全球最大的Java用户之一,我们也一直在探索Java前沿技术的应用,通过在阿里丰富的业务场景中进行实验,真正将这些技术应用到真实的生产环境中。我们也非常乐意分享和贡献Java领域的经验、实践和技术见解,包括将于明天发布的《Java 开发手册》,共同推动Java的发展。参考[1]https://www.infoq.com/news/2017/10/javaone-opening/[2]https://www.oracle.com/technetwork/java/javase/11-relnote-issues-5012449.html#Diffs[3]https://openjdk.java.net/jeps/377[4]https://mp.weixin.qq.com/s/FQpvT5wIy9xwhX2jHMU7aw[5]https://mp.weixin.qq.com/s/K1us6aH-gjHsWGhQ3SulFg[6]https://www.infoq.cn/article/uzHpEbpMwiYd85jYslka【本文为专栏作者《阿里巴巴官方技术》原创稿件,转载请联系原作者】点击在这里可以看到作者更多的好文章