招生合作
课程分类
您当前的位置:重庆凯学网 >重庆凯学网 >Java正青春:现状与技术趋势报告

重庆Java学习网

Java正青春:现状与技术趋势报告

发布时间:2021-08-03 09:57:28 已帮助:97人

Java正青春:现状与技术趋势报告

Java 正青春:现状与技术趋势报告
  今天,小编想和大家聊一聊《Java开发手册》,在《Java开发手册》泰山版发布之际,我们来总结思考一下Java的最新技术动向和未来。
  背景
  1991年,James Gosling带领团队开始了一个叫"Oak"的项目,这个就是Java的前身。1995年,Java1.0发布。“Write once,run anywhere"这句Java口号想必大家耳熟能详。Java刚开始出现的时候主要面向Interactive Television领域,直至后来几年的发展,当时的SUN(后来在2010年被Oracle收购)一度想用Java来打造桌面的网络操作系统,取代当时如日中天的Windows。不过Java后来的发展,不曾想虽未在桌面领域内取得多大的建树,出乎意料地,却在企业级应用领域开花结果,占据了如今几乎统治的地位。失之東隅,却收之桑榆。
  JavaSE开源现状
  Sun在2006年的Java One大会上,宣布Java技术开源,随后2006年底在GPL协议下发布HotSpot以及javac,这是Java发展中的里程碑事件。阿里巴巴最早在2012签署OCA,并参与到了OpenJDK的开发。
  图片
  OpenJDK是JavaSE开源的Reference Implementation。在JavaOne 2017的Keynote上(2018年JavaOne被Oracle重命名为CodeOne),Oracle承诺将开源所有的OracleJDK里包含的商业实现功能[1]。
  图片
  在2018年发布的Java11,Oracle已经让OpenJDK和Oracle JDK两者的二进制文件在功能上尽可能相互接近,尽管OpenJDK与OracleJDK两者在一些选项之间仍然存在一些差异[2]。
  另外,除了OpenJDK这条主线,在最近的几年里,Java基础技术的开源有愈演愈烈趋势:2017年,IBM将内部使用20多年之久的J9虚拟机开源,并贡献到Eclipse Foundation,而随后2018年,Oracle开源GraalVM 1.0,其核心包含用Java写的Just-in-Time compiler/Graal,SubstrateVM以及支持多语言解释器的Truffle框架。各个企业开源的主要动机,想通过开源构建并受益于一个更为强大的语言生态系统。
  云+开源结合在一起,使得普通开发者以较低的门槛获得工具(链)的使用和体验,任何一家企业都可以像任何大型组织一样,使用的相同技术(democratizing),这是开发者的黄金时代。
  Java is Still Free:你该选择什么样的JDK?
  Java仍然免费,但随着OracleJDK License变化开始转向收费,OpenJDK会逐渐取代OracleJDK成为市场主流,这点也可以从JVM 2020生态报告中看出趋势:OracleJDK从前一年的70%的开发者选择使用率降到2020年的34%。
  OracleJDK收费,在客观上也加剧了OpenJDK生态的碎片化趋势,出现了包括Alibaba Dragonwell在内的多个基于OpenJDK的可选实现。
  企业在选择使用那个Java Vendor的JDK版本时,几个方面的考虑因素可以参考:
  安全与稳定:是否会及时同步上游的最新更新,包括安全补丁,关键的问题修复等。
  JavaSE标准兼容:是否与标准Java兼容。
  性能与效率:是否可以在问题诊断,性能调优方面提供有效的工具支持,帮助一线的开发同学高效地解决Java问题。在JVM,到JDK(Class library)层面,是否有面向企业业务场景的优化特性,可以帮助提升资源的利用率,生产系统的稳定性等等。
  快速的新技术采纳:伴随收费,Oracle管理Java版本生命周期采用了Long Term Support(LTS)的概念,Oracle每三年会指定一个LTS的Java版本,Java 8/11都是LTS版本。大部分企业,尤其是大中型企业很难跟上Java每六个月一发布的节奏,像Java 12,13这样的Feature Release(FR)版本。那么问题来了,如果你选择Stay在LTS版本上,比如Java 11,在新版本(Java11+)发布的JVM/JDK技术,是否可以在不升级的情况下,提前享受这些技术红利?
  这里分享下Alibaba Dragonwell在这些方面的计划与思考。
  Alibaba Dragonwell是阿里巴巴内部广泛使用的AJDK(AlibabaJDK)的开源版本,Alibaba Dragonwell作为基石,支撑了阿里经济体内几乎所有的Java业务,经过了双11等大促的考验。Alibaba Dragonwell主要针对的场景是数据中心大规模Java应用部署情况下,Java应用稳定性、效率以及性能的优化与提高。
  2019年3月阿里开源Alibaba Dragonwll 8.0.0,我们也一直正在践行开源时候的承诺,AJDK内部使用的特性在逐步开源。到刚刚发布Alibaba Dragonwell 8.3.3,我们已经开源了JWarmup,ElasticHeap,多租户,JFR等众多功能,协程Wisp 2.0,GCIH等也在开源的规划上。
  图片
  同时,Alibaba Dragonwell作为OpenJDK的下游,每个发行版都会同步上游最新更新,包括安全更新,问题修复等,并经过阿里内部大规模的应用集群测试。
  在新技术Adoption方面,Alibaba Dragonwell目前发布和维护了Java 8,11两个LTS版本,阿里JVM团队会根据实际业务状况,移植Java11+的相关功能到Java 8和11两个版本,这样Alibaba Dragonwell用户可以在不跟进Java 12,13等这些FR版本的情况下,提前享受这些功能带来的技术红利。
  OpenJDK技术趋势
  纵观Java技术20多年的发展,始终围绕着两大主题:Productivity以及Performance。在很多情况下,Java在设计上Productivity是优于Performance考虑的。Java引入的Garbage Collector把程序员从复杂的内存管理中解脱出来,但在另一方面Java应用始终困扰于GC暂停时间的影响。Java基于栈式虚拟机的中间字节码设计,很好地抽象了不同平台(Intel,ARM等)的差异性,同时通过Just-in-Time(JIT)编译技术,解决的Java应用peak性能,但在另一方面JIT不可避免引入了Warmup的代价,正常情况下Java程序永远需要先load class,解释执行,然后再到高度优化的代码执行。
  如果从JVM视角来总结梳理下目前OpenJDK社区正在发生,孵化的相关技术,主要从工具,GC,编译器,以及Runtime四个方面进行一个主要概括:
  图片
  JFR/JMC
  Oracle从Java 11开源了其之前一直作为商业功能的JFR,JFR是功能强大的Java应用问题诊断与性能剖析工具。阿里巴巴也是作为主要的贡献者,与社区包括RedHat等,一起将JFR移植到了OpenJDK 8,预计2020年7月即将发布的OpenJDK 8u262(Java8)将会默认带有JFR功能,这样Java 8的用户可以基于这个版本免费使用JFR功能。
  ZGC/Shandoath
  无论是Oracle在Java 11发布的ZGC,还是RedHat已经做了好几年的Shandoath,都实现了concurrent copy GC,解决Large Heap情况下的GC停机性能。ZGC最新状态,在9月份即将发布的JDK 15,ZGC将从Experimental功能变为生产可用[3]。实际上,在AJDK 11上,阿里巴巴团队JVM团队已经做了大量Java 11+到Java 11的ZGC移植工作,以及相关问题修复,2019年双11和阿里数据库团队一起,让数据库应用运行在ZGC上,100+GB Heap情况下GC暂停时间可以保持在<10ms以内,详细讨论参考[4]。
  Graal
  用Java开发的新一代Just-in-Time编译技术,用来替代目前HostSot JVM的C1/C2编译器,OpenJDK上的Ahead-of-Time(AOT)技术也是基于Graal编译器开发。
  Loom
  OpenJDK社区协程项目,对应于AJDK的Wisp 2.0实现,详细讨论可以参考[5]。
  进击的Java:面向未来演进
  2020,站在一个全新的节点上,本文也从三个大的方面Cloud Native,AI,以及多语言生态三个方面展望下未来的发展,有些讨论本身是超越Java本身的。
  面向Cloud Native的语言进化
  云原生时代,软件的交付方式发生的根本性变化。以Java为例,在之前Java开发者交付的是应用本身,具体体现在以"jar","war"的形式交付,而云原生则是以Container为交付单位的:
  图片
  在运行方面,面向Cloud Native的应用要求:
  Reactive
  Always Watching
  Extreme low memory footprint
  Quick boot time
  Java语言作为企业计算,互联网领域的王者,拥有一致性,丰富的构建在Java语言之上的生态系统,丰富的三方库,多样的Serviceability支持等,随着云时代应用微服务化,Serverless,这些新的架构逐渐触及到了Java程序速度提升的天花板——Java自身的启动运行开销。
  在Cloud Native这个新的上下文里,我们谈论语言的进化,绝不仅仅限于运行时,编译器层面,新的计算形态一定伴随着编程模型的变革,这涉及围绕程序语言的Library,Framework,Tools等一系列配套的改革。从目前业界来看,也有不少的项目正在发生:配合GraalVM/SVM(Java静态编译技术)的下一代编程框架Quarkus,Micronaut,以及Helidon,Quarkus更是提出了“container first”,他们提倡的分层的lightweight uber-jar的概念正是符合了container交付这一趋势。而Red Hat的Java团队与OS团队合作的"Checkpoint Restore Fast Start-up"技术(AZul在JVM技术峰会'2019上也提出过类似的想法)则是在更加底层的技术栈上解决Java快速拉起问题。
  在Java for Cloud Native方向,我们也开展了相关研发工作。Java是静态语言,但是包含了大量的动态特性,包括反射,Class Loading,Bytecode Instrument(BCI)等等,这些动态特性本质上都是违反GraalVM/SVM所要求的Closed-World Assumption(CWA)原则,这也是导致传统跑在JVM的Java应用不容易在SVM编译运行的主要原因。阿里巴巴JVM团队对AJDK做了静态化裁剪,务求在Java静/动态特性之间找到一个确定的边界,从JDK的层面为Java静态编译提供可能性。同时向上,与蚂蚁中间团队合作,定义面向静态编译的Java编程模型,通过编程框架来约束-Java应用的开发是面向静态编译友好的。我们静态编译了基于蚂蚁开源中间件SOFAStack构建的服务注册中心Meta节点应用,相较于传统的运行在JVM上,性能有量级的提升:服务启动时间降低了17倍,可执行文件大小降低了3.4倍,运行时内存降低了一半。详见[6]。
  AI的兴起,编程语言异构计算的新挑战
  2005年,时任Intel CTO的Justin Rattner,说过“We are at the cusp of a transition to multicore,multithreaded architectures”,在前后的十几年中,编程语言与编译器领域一直在努力面向parallel architectural paradigm做优化探索。随着AI这些年的兴起,不同的时间节点,相似的场景,面向FPGA/GPU异构计算场景,对编程语言与编译器领域提出了新的挑战。
  除了传统Compiler诸如IBM XL Compilers,Intel Compilers等做的Automatic Parallelizing工作,在极致性能探索方面,基于多面体模型(polytope model)的编译优化技术作为解决程序并行化、数据局部性优化的一种手段,成为编译优化领域的研究热点。
  而在Parallel Languages层面,对C&C++开发人员,CUDA的出现降低了GPU的编程门槛,但GPU和CPU两种硬件模型本质区别,导致过高的开发成本,需要学习和了解更多底层硬件细节,还更不用说更高级语言的开发语言像Java等所面临的底层硬件模型与高级语言之间巨大的GAP。
  在Java领域,最早在JVM技术峰会'2014,AMD曾经分享过他们的Sumatra项目,尝试实现JVM与Heterogeneous System Architecture目标硬件交互。而在最近,由The University of Manchester发起的TornadoVM项目,实现包含:一个Just-in-Time编译,支持从Java bytecode到OpenCL的映射,一个优化的运行时引擎,以及可以保持Java堆和异构设备堆内存一致性的内存管理器。TornadoVM的目标是开发人员不需要了解GPU编程语言或者相关的GPU体系结构知识就可以编写面向异构的并行程序。TornadoVM可以透明地运行在AMD GPUs,NVIDIA GPUs,Intel integrated GPUs以及multi-core CPUs上。
  在通用CPU领域,OpenJDK社区的Vector API项目(Panama的子项目),依赖CPU的SIMD指令,获得计算性能的成倍提升,Vector API在大数据,AI计算也有非常广的应用场景。阿里JVM团队把Vector API移植到了AJDK 11。
  Polyglot Programing,链接多语言生态
  Polyglot Programming并不是一个新的概念。在Managed Runtime领域,2017年IBM开源Open Managed Runtime(OMR),以及2018年Oracle开源Truffle/Graal技术。OMR和Graal技术让开发人员实现一个新的语言成本大幅下降。前者OMR以C、C++组件的形式提供了Garbage Collection(GC),Just-in-Time(JIT)以及Reliability,availability and serviceability(RAS,工具)等,开发人员可以依赖这些组件,通过'glue'的方式基于这些组件实现自己的高性能语言。而后者Truffle/Graal,Truffle是一个依赖AST parser实现新的语言的Java框架,本质上是将你的新的语言映射到JVM世界。不同于Scala,JRuby这些围绕JVM生态本身构建的语言,他们本质是还是Java,无论是OMR,还是Truffle/Graal,他们都提供了生产级的GC,JIT,以及RAS服务支持,新开发的语言完全不需要再重新实现这些底层技术。
  从业界来看,面向特定领域的Domain Specific Language(DSL)语言已经有向这些技术迁移的趋势,高盛正在与Graal社区合作,把他们的DSL迁移到Graal上。另外Ruby/OMR,Python/Graal,JS/Graal,WASM/Graal等这些真正链接不同语言生态的项目,也正在迅速发展起来。
  回到AJDK,Graal已经在AJDK 8开始支持,JS/Graal这样成熟的技术,已经在阿里内部业务上线。
  最后
  Java是一项二十多年前被发明出来的技术,她历经磨难,几易其主,但却历久弥新。这篇报告旨在为Java的开发者们梳理下目前的Java技术现状,以及讨论在云,AI等这些重要领域内Java技术的演进趋势。在介绍的相关部分,我们也穿插了阿里的一些工程实践。作为世界上的Java用户之一,我们也一直在探索把前沿的Java技术,通过在阿里丰富的业务场景的试验,真正把这些技术应用于真实的生产环境。我们也非常乐于分享和贡献Java领域的经验、实践与技术洞见,包括明天即将发布的《Java开发手册》,共同促进Java的发展。