其他分享
首页 > 其他分享> > 为什么阿里巴巴禁止在 foreach 循环里进行元素的 remove/add 操作

为什么阿里巴巴禁止在 foreach 循环里进行元素的 remove/add 操作

作者:互联网

 · Oracle 撒手,宣布对个人用户 (Personal Users) , Java 8 官方支持时间持续到 2020 年 12 月;对商业用户(Commercial Users),2019 年 1 月之后不再提供免费更新。

     ·  红帽喊话,计划在 2023 年之前继续提供对 OpenJDK 8 的支持。

· AWS 加入,正式推出 OpenJDK 长期支持版本 Amazon Corretto。

如今,阿里巴巴也宣布重磅开源 OpenJDK 长期支持版本 Alibaba Dragonwell。

这不禁让人感叹:Java 生态圈碎片化趋势越来越明显。对开发者而言,既不希望冒风险即刻更换,又希望可以使用具有持续安全更新和完备功能的 JDK。此时,阿里巴巴宣布开源 OpenJDK 长期支持版本,出于哪些考虑?这是否可以打动坚守的 Java 8 群体并解决其燃眉之急?未来,阿里巴巴打算如何处理这一项目与 OpenJDK 的关系?这家 Java 代码量上亿 (billion lines of Java code ) 的公司如何看待 Java 的未来?

针对上述问题,InfoQ 记者独家专访阿里云智能基础产品事业部资深技术专家李三红、阿里云智能基础产品事业部研究员 Kingsum Chow (周经森),听他们如何看待 Alibaba Dragonwell 与 Java 归途。

Alibaba Dragonwell

Java 生态圈内的不少开发者想必对 AWS 开源的 OpenJDK 长期支持版本 Corretto 项目名字的来历有所耳闻,Corretto 由 Caffe Corttto 演变而来,这是一种意大利饮料,指含有少量白酒的浓缩咖啡。无独有偶,Alibaba Dragonwell 的命名也与饮料颇有渊源。周经森在采访中透露:

“Dragonwell”中文译为龙井,象征着中国的茶文化,又恰好是杭州特色(阿里巴巴总部所在地);“well”一词通常被描述为水源汇聚在一起供大家享用,我们希望可以集合所有开发者的力量不断完善该项目并最终贡献给所有用户。

为何此时开源?

在很大程度上,Java 由 Oracle 长期主导。自 2017 年底,Oracle 就开始陆续转变 Java 策略,逐渐将 Oracle JDK 中的商业功能开源给社区,并宣布不再提供免费商业版本更新,不提供安全更新和漏洞修复支持。

这对开发者而言意味着什么?如果你是 Oracle JDK 8 的用户,原 License 尚可免费使用,但之后若希望得到持续安全更新则需要为此付费。如今,在 Oracle 主导下的 Java 大环境已经发生变化。作为最大的 Java 的用户之一,阿里巴巴几乎拥有世界最大规模的 Java 应用集群,肯定需要为此采取一些行动。

在采访中,李三红表示,Oracle 的系列转变传递出一个重要讯息:

如果希望继续免费使用 Java 并获得持续更新,那之后可能就需要转换到社区版本。

基于此,阿里巴巴决定开源 OpenJDK 长期支持版本 Alibaba Dragonwell,一是因为其自身拥有大量 Java 客户和业务需求,阿里巴巴希望他们可以继续免费享受到 JDK 的所有功能;二是考虑到不少开发者可能会做出新的选择,阿里巴巴决定开源该项目,为开发者提供一个新的参考。

重要特性

Alibaba Dragonwell 是一款免费的 OpenJDK 发行版,其提供长期支持,包括性能增强和安全修复,这部分其实对应于 Oracle 收费部分的功能。李三红透露,Alibaba Dragonwell 目前支持 x86-64/Linux 平台,主要针对的场景是数据中心大规模 Java 应用部署情况下,Java 应用稳定性、效率以及性能的优化与提高。

此次发布的 Alibaba Dragonwell 8 预览版本对应 OpenJDK 8 版本,与 Java SE 标准兼容。值得重点关注的三大特性如下:

     ·  移植上游 Java 11 的 Java Flight Recorder (JFR) 功能。众所周知,JFR 功能是 Oracle JDK 的商业收费功能,需要付费才可使用,虽然后期通过 OpenJDK 11 开源,但 Java 8 的用户群体仍然十分庞大,因此阿里巴巴决定将该功能移植到 Alibaba Dragonwell 8 中供开发者使用。Java 开发人员可以通过 JFR 收集 JVM 运行过程中的详细 profiling 信息,配合 Java Mission Control (JMC), 提高 Java 应用的问题诊断及性能优化效率;

     ·   集成 JWarmup 技术。Warmup 问题一直是 Java 应用的最大难点之一,虽然阿里内部很早就有应对之法,但外部用户很难触达这一方案。如今,JWarmup 已作为 Java Enhancement Proposal(JEP) 在 OpenJDK 立项,未来有望加入 Java 标准发行版。JWarmup 允许用户在数据中心结合应用流量调度时机,动态提前预编译 Java 代码,从而有效减少由于传统 Just-in-Time 预热 (Warmup) 导致的 CPULoad 过高,Response Time 超时等问题;

     ·   提供 GC 问题诊断等 Serviceability 方面的提高。

想必有心的开发者已经发现,目前 Alibaba Dragonwell 仅支持 Linux 平台,这也是大部分数据中心所使用的操作系统。为防止开发者出现误解,此处需要特别说明:这并不影响 Java 的跨平台特性。因为,跨平台指的是 Java 应用本身,JDK(包括 JVM)只是一个软件,不同平台有不同的版本,只要在对应平台安装好对应的 JDK。开发者可以在任意系统上开发 Java 应用,再部署到相应平台运行字节码文件即可。(开源后,阿里巴巴会提供详细的中英文使用文档说明)

后续规划

未来,阿里巴巴希望每个季度进行一次版本迭代,下一阶段也就是 3 个月后预计会发布 GA 版本。除此之外,阿里 JDK 技术团队会对该项目进行持续维护和更新,并将紧密与 OpenJDK 社区合作,促进 Java 技术的发展。

此外,考虑到用户实际需求以及 Java 8 群体的庞大性,阿里巴巴后续也会考虑继续将 OpenJDK 后续版本中的优秀功能移植到 Alibaba Dragonwell 中,类似于上文提到的 Java Flight Recorder 功能,供开发者在生产环境中提前使用。

阿里巴巴与 Java

2018 年,阿里巴巴获邀加入 JCP 最高执行委员会,任期两年,这也是第一家加入 JCP 的中国企业。JCP 是一个开放的国际组织,是 Java 最高执行委员会,由 Java 开发者以及被授权者组成,主要职能是发展和更新 Java 技术规范,这意味着阿里巴巴在 Java 标准规范制定中具有一定话语权,并可以参与 Java 生态重大事件的决策。

据调查,阿里巴巴是全球最大的 Java 用户之一,其内部拥有数量非常庞大的 Java 开发人员和服务器,这也是其业务发展使然。提到阿里巴巴,最容易想到的标签就是“双十一”。2018 年,天猫双十一的总交易额最终定格在 2135 亿,不到 2 小时就破了千亿大关,支撑系统高效运行背后的最大功臣莫过于 Java。

随着体量增长和业务需求复杂性的提升,阿里巴巴在 2004 年决定从 PHP 语言全面转向 Java,并急需更高效的方式来解决生产环境中的问题, 这逼着阿里巴巴不得不基于开源技术自我构建解决方案,指导 Java 开发人员快速定位并解决问题。

互联网企业的节奏非常快,一周内甚至需要迭代很多版本,这其中就会出现很多问题,如果全部依靠官方更新来解决,整个战线瞬间被拉长,业务根本等不起。这也是很多互联网企业选择基于开源版本的一个非常重要原因:自主可控,快速构建匹配业务发展的解决方案。

最早于 2010 年,阿里开始基于 OpenJDK 6 进行 JVM 定制优化,这是国内第一个优化、定制且开源的服务器版 Java 虚拟机。之后,阿里内部多个团队陆续都开始参与了 JDK 研发(没错,最开始确实是多个团队都在做),随后,阿里巴巴考虑到 JDK 作为一项重要的基础设施,几乎覆盖了物流、金融、电商、新零售和菜鸟等所有业务场景,长期分开研发肯定是不行的,便将所有 JDK 团队合并为一个。

2015 年,统一后的阿里 JVM 团队开始着手基于 OpenJDK 8 进行优化和定制工作,并推出了如今众所周知的定制版 AJDK (Alibaba/AlipayJDK) ,这几乎承载了淘宝、天猫,蚂蚁,菜鸟的所有核心应用,并经受住了多次双十一考验。

那么,如今开源的 Alibaba Dragonwell 与阿里内部使用的 AJDK 是一个东西吗?

通过阿里的业务运行情况来看,AJDK 的功能和性能确实不错,但本次开源的 Alibaba Dragonwell 与 AJDK 还是有差异的。李三红表示,Alibaba Dragonwell 是 AJDK 的开源版本,AJDK 技术的继承者。目前开源的版本并未包含 AJDK 的所有功能,比如多租户,Wisp 协程,ZenGC 等,主要是因为开源一个技术会涉及到比较长时间的准备。

就目前公开的 Alibaba Dragonwell 8 预览版本,阿里内部其实也进行过很多次讨论,反复准备、测试、沟通,确定后又耗费了半年时间才最终将该预览版本开源,之后,阿里会考虑将 AJDK 的功能逐渐过渡到 Alibaba Dragonwell。显然,这一工作需要时间。

各家 JDK 火热,OpenJDK 咋办?

不同于 Oracle JDK,OpenJDK 是基于 GPL v2/a Classpath Exception 的开源项目,从 Java 7 开始就是 Java SE 的官方参考实现。曾有 OpenJDK Committer 在接受采访时表示,OpenJDK 有一个约定成俗的做法,经过多年免费支持后,Oracle JDK 版本的生命周期就进入结束期,之后由社区接手并主导后续更新。在此之前,Oracle 已经为 JDK 8 免费提供了五年支持,也是时候进入社区维护阶段了。

如今,国际不少主流厂商都在使用 OpenJDK,比如 Google、Twitter、Amazon 和阿里巴巴,并研发了基于此构建的 JDK 版本,这让不少生态圈内的开发者出现担忧:在不少用户开始考虑选择 OpenJDK 的时候,这些大厂是否还有心思参与整个社区的维护?

从阿里巴巴层面来看,李三红在采访中反复强调一个观点:

Alibaba Dragonwell 一定是 OpenJDK 的下游,每个 Alibaba Dragonwell 发行版都会同步上游最新更新,并经过阿里巴巴内部大规模的应用集群测试。同时,阿里巴巴也会积极将 AJDK 上的技术积累贡献到 OpenJDK,积极参与社区的项目更新和维护。

AWS 方面与这一观点也颇为类似,AWS 首席开源技术专家 Arun Gupta 曾在 AWS 开源博客上发布公告称:

我们期待与 OpenJDK 社区密切合作,共同开发 OpenJDK 8 和 11 的未来增强功能。

就笔者看来,这一状态下,各大厂商推出的 JDK 势必会与 OpenJDK 存在些许差异,这很容易理解:客户生产环境所遇到的实际问题未必适合 OpenJDK 的改进;面对同一问题,OpenJDK 的解决方案未必与各大厂商的想法一致,这就需要多方进行友好协商,并逐渐形成良性机制,现在只是迈出了推动 OpenJDK 的第一步。

Java 归途

选择多了,生态似乎更“碎”了,坚守 Java 8 的开发者未来有意愿向 OpenJDK 迁移吗?

坚守的 Java 8 群体

既然 Java 8 和 Oracle JDK 8 存在这样那样的问题,为什么开发者不大规模迁移至更新的版本呢?为什么 Alibaba Dragonwell 依旧从基于 OpenJDK 8 开始呢?这个问题的答案很简单:

Java 8 是目前最被广泛使用的版本,并且其群体非常坚守!

在 Java 圈内,你会发现一个很有趣的现象:无论新版本给出的更新多么诱惑,大部分 Java 开发者似乎并不感兴趣,依旧坚持自己的选择。确实,Java 8 是一个非常成功的版本,以至于很多开发者并不认为需要更新其他版本,这可能与长期养成的习惯和固有信任有关系。

对此,李三红认为,Java 这么多年发展过来,大多数开发者已经习惯信任官方 Oracle JDK,对社区 OpenJDK 版本关注不够,所以从 Oracle JDK 到 OpenJDK 的切换需要一个过程。但随着这些国际科技大厂的努力,OpenJDK 的生态一定会越来越完善,功能也会更加齐备,面对持续的安全更新和众多大厂的深度参与,这个项目应该会成为 Java 生态中的重要公共资源。

越来越“碎”的生态

很早之前,Java 生态就开始出现碎片化趋势,这在 Oracle 收费之后似乎得到了加剧。此前,为了减少对碎片化问题的潜在担忧,AdoptOpenJDK 曾强烈鼓励所有 OpenJDK 提供商将补丁提交给 OpenJDK。

对此,周经森认为,就开发者而言,目前的选择越来越多,这不见得一定是件坏事。并且,不同版本之间的兼容性其实非常高,迁移成本几乎为零,这不会给用户使用造成额外负担。不同的版本在性能优化、平台支持等方面确实存在些许差异,开发者可以根据需要进行选择,但阿里巴巴正在努力将这些技术推向上游,也就是整个 OpenJDK 生态,这一问题应该会在未来得到缓解。


标签:Java,JDK,OpenJDK,Dragonwell,开源,remove,Alibaba,add,foreach
来源: https://blog.51cto.com/13399166/2366093