云原生时代,Java会走向末路吗?
唱衰Java的声音由来已久。
尤其是近几年,云原生时代的到来,软件的交付方式发生了根本性变化,Java遭受了诸多质疑。
传统领域的Java开发,交付的是Java应用本身,具体体现在以“jar”“war”的形式交付,而云原生最佳实践,则是基于微服务形式,以容器为基本交付单位,并在K8S中编排。云原生应用要求更快速地启动、强调资源按量消费,弹性扩展,以及可观测性等。就这一层面而言,在云原生时代,Java的缺陷确实是天然存在的。
“事实上,Java技术在云原生时代也在不停地进化。”面对唱衰Java的诸多论调,龙蜥社区Java语言和虚拟机SIG成员、龙蜥社区RISC-V SIG成员、阿里云程序语言与编译器团队负责人、Java Champion李三红选择理性看待。
“比如更多支持容器部署的特性已经加入到OpenJDK版本。一直被人诟病的Java启动慢的问题,目前基于OpenJDK技术的几个创新项目正在多个不同方向探索,包括CRaC(Coordinated Restore at Checkpoint)、Leyden,以及由阿里和Google作为主要贡献者的Fast Startup Incubator等项目。在资源弹性使用方面,由Alibaba Dragonwell提供的Elas ticHeap功能,主要目的是解决云计算环境下Java内存资源使用的弹性问题。最后,Open JDK的JFR以及JFR Streaming技术为构建Java云原生可观测工具提供了重要的技术支撑。”
Java面临的挑战,不仅仅是云原生。
李三红认为,从1995年Java 1.0发布算起,Java技术这二十多年的发展,大致存在一明一暗两条线的驱动。“一条暗线,是指Java或者说支撑Java的底层JVM技术适配计算机架构的演进与发展。一条明线,是指Java作为一个开发者工具,本质是要面向业务领域解决业务问题的,所以自然而然地推动了Java在云原生,AI等方向的演进,解决这些领域内碰到的问题与挑战。”
后摩尔时代,算力增长放缓,更多利用多核、SIMD(单指令多数据流)等并行计算技术,以及异构来释放更大的算力。相较于C/C++这些传统编译型语言,Java处在软件栈的更高抽象级别,自带Java标准库,以及运行时环境,这也给Java创新带来了更多的空间以及可能性。
李三红指出,Java在多核、异构加速领域做了多方面的探索,适应与优化。比如,OpenJDK孵化的Vector API项目,依赖CPU的SIMD指令,获得计算性能的成倍提升。即将发布的OpenJDK 19引入了Virtual Threads(Preview),旨在帮助Java开发者高效处理并发(尤其针对IO密集型场景)。而在异构领域,早2014年JVM技术峰会,AMD就分享了Sumatra项目,尝试实现JVM与Heterogeneous System Architecture目标硬件交互。由The University of Manchester发起的TornadoVM项目,目标是帮助Java开发者不需要了解GPU编程语言或者相关的GPU体系结构知识就可以编写面向异构的并行程序。
在AI方向上,Java也在与时俱进。据李三红介绍,在企业计算领域,Java是被使用最多的语言之一,但对于机器学习领域的开发,Java一直缺乏标准支持,这个方向其实在JCP-EC讨论也比较多。
基于Java SE技术,在JCP流程内推动并最终在2022年定稿的JSR 381规范,其目标就是为不同领域的Java机器学习开发提供通用的可重用设计。JSR 381定义了标准的Java API,提供了基本机器学习、图像分类和对象识别方面的处理能力。“依赖于不同的机器学习平台,如TensorFlow、MXNet以及DeepNett等,JSR-381提供了不同的实现。对于Java生态内的开发者来说,不必再去学习Python,可以依赖JSR-381 VisRec API去构建你的AI应用。”
现实中,Java应用的版本升级是较为缓慢的。Java 11(OpenJDK11)距离2018年发布已经过去四年多,目前国内大多数的用户仍然停留在Java 8。李三红认为,动力不足是多方面的,对开发者来说最直接的原因可能是担心升级后兼容性带来的稳定性问题,会直接影响业务的连续性。
这种问题并不罕见。令人振奋的是,处于Java生态中的企业正在贡献自己的力量。阿里内部在大规模地往Java 11、Java 17迁移的时候,总结了不少的经验,并且将这些经验通过工具的方式沉淀下来。最后阿里开源了EMT4J(Eclipse Migration Toolkit for Java),能够帮助Java应用无缝升级最新版本JDK,主要支持从Java 8到Java 11,以及17的升级。
李三红还补充道,对于Java版本的升级问题,还可以从另一个角度——Software Sustainability来进一步探讨。
“由Titus Winter等编写的《Software Engineering at Google-Lessons Learned from Pro gramming Over Time》一书中,谈到了组织的Codebase Sustainability概念,强调了两个核心理念:第一,无论应对的是技术需求,还是业务需求,软件代码应当可以做一切应该做的改变。第二,这些改变带来的影响是安全的。
“回到Java版本升级这个问题,我们在开发Java应用的时候,建议应用架构师们把Java版本升级纳入到Software Sustainability这个维度下考量,对代码开发规范进行相关的约束。例如,不要让你的代码依赖JDK内部不公开的API,不要让你的实现依赖特定的JDK版本行为,不要使用被Deprecated的API等等。架构的目标应当考虑Code Sustainability,让你的Java应用可以在任何时候根据实际需要平滑升级到不同JDK版本,不应当因为代码缺乏Sustainability而导致的尽量少的版本升级。”
李三红对Java的未来充满信心,源于他在JVM领域耕耘多年,不仅深入了解Java特性,并且有能力进行创新性研究。
在加入阿里之前,李三红一直在IBM Java技术中心,参与J9虚拟机开发,期间领导了JVM多租户项目。目前就职于阿里云,领导程序语言与编译器团队,主要的工作是结合阿里、蚂蚁及云上各业务的需求,在编译器、语言运行时等基础领域进行研究创新。编程语言是基础软件的核心,也是龙蜥技术生态的八大方向之一,Dragonwell是龙蜥社区Java语言和虚拟机SIG下的项目。目前,在语言工具链这块,已经形成Alibaba Dragonwell(Java生态),Alibaba Cloud Compiler(C++生态)等多个产品来支撑其业务,语言工具链相关的开源技术也在为龙蜥社区的开发者提供支持。
2020年,李三红获得了Java技术领导者社区Java Champions推荐,被授予Java Cham pion荣誉。Java Champion由Java社区成员提名,并且必须得到现有Java Champions成员的一致同意。唯有为Java / JVM生态系统做出重要贡献的专家才能获此荣誉。
去年,龙蜥社区理事长单位阿里云第三次入选JCP最高执行委员会(JCP-EC),作为阿里云在JCP-EC的代表,李三红一直在参与JCP-EC领导下的相关Java标准讨论制定工作。