这持续性的变化让大家不断困惑, 开发 者不知道还能不能愉快地免费使用 Java,也不清楚接下来将会面对一些什么。
虽然 Oracle 官方有解释,并且也有 30 几位 Java 社区领袖与专家联名发表了一篇文章,详细分析了 Java 其实还是免费的等相关问题,但是因为普遍存在语言与网络障碍,并且也有理解上的偏差,再加上一些自媒体的过度制造焦虑,使得本身就复杂的问题变得更加难以理解。
在前阵子开源中国举办的技术会议“源创会年终盛典”上,资深 Java 专家 杨晓峰 为与会者带来了针对 Java 11 的最新解读,带领大家重新认识了现代 Java。
杨晓峰是 OpenJDK Committer,目前在京东担任大数据中心架构师,曾领导 Oracle 北京 Java 核心类库等团队,参与甚至负责过 Java 8~11 核心类库等部分新特性的相关任务。
我们借此机会邀请他为大家 把 Java 这令人困扰的事理清楚 了。
杨晓峰一开始就直接来了一句: Java 还是免费的 。话是这么说,但实际上这并不足以打消疑虑,也存在一些更加具体的问题需要解释,具体是怎么回事呢?
首先要理清一些概念,一方面是 Oracle JDK 面向的用户类型:
Oracle客户,主要是指那些购买了 Oracle Java SE 相关服务支持的用户,比如,通过前边讲到的订阅模式购买服务的客户。
商业 用户 ,免费使用 Java 用于商业目的的实体。
个人用户,在个人电脑上,免费使用 Java SE,以及不用于商业目的开发人员。
当前大部分使用 Oracle Java 的开发者/所在公司是属于哪一种类型的用户呢?是第二种—— 商业 用户。
再来看看关于“ Oracle 的 Java ”。一方面,Oracle 主导着 OpenJDK 社区,它本身自己做了一个叫 Oracle JDK 的产品,这是它的 商业产品,也是目前最为广泛使用的 JDK ;另一边,Java SE 9 以来,Oracle 也提供 Oracle 的 OpenJDK 发行版 Oracle’s OpenJDK ,而这个 Oracle's OpenJDK 就是完全开源免费的,可以用于商业用途。
杨晓峰解释:
OpenJDK 是基于 GPL v2 的开源项目,从 Java 7 开始,就是 Java SE 的官方参考实现。狭义上的 OpenJDK 往往是指基于 OpenJDK 构建的发行版,各个主流厂商的 JDK 产品基本上都是基于 OpenJDK 源码,或多或少增加自己的定制内容。
Oracle JDK 是 Oracle 提供的商业 JDK 实现,是目前应用最广泛的 JDK,在 JDK 11 之前,Oracle JDK 与 Oracle's OpenJDK 除了一些强大的商业特性,还有 CA 根证书等便利性内容和细微差别。
从 JDK 11 开始,Oracle JDK 使用原来的商业 BCL License,而 Oracle's OpenJDK 开始独立改用GPL v2+CPE License, 二者提供同样的功能,本质上没有不同,但是不同的 License 针对不同用户 。
像前边所说,关于 Java 的使用困惑是一波接一波的,首先是 Oracle 公告从 2019 年 1 月以后,将不 再为商业用户提供免费的 Java SE 8 更新 服务。商业用户可以使用 Oracle Java SE 订阅模式继续享受更新支持;而个人用户不受影响,还可以继续享受免费更新到 2020 年 12 月。
杨晓峰解释:
这本来其实就是一个 正常的软件生命周期结束(EOL) ,不必过度解读, Oracle 已经免费支持了 5 年 JDK 8 了 。
OpenJDK 有一个约定成俗的做法,就是经过多年免费支持以后,Oracle JDK 版本会进入 End of Life,也就是生命周期结束 EOL,然后由社区接手并主导后续更新事务。
之所以目前只有这个 Java 8 的 EOL 导致恐慌,主要是因为这个 Java 8 太成功 了,相当多用户还没有准备好,也没有足够动力去升级 JDK,这就像目前还使用 Windows XP 的用户,无法获取官方更新,但是还是很多用户停留在上面。
另外一个不容忽视的原因是,Oracle 显著 缩短了其提供后续 JDK 版本的免费支持周期 (目前建议为半年),社区会承担长期支持版本(LTS,Long-Term-Support)的后续更新工作。
所以实际上,开发者其实不太需要去关注 Java 8 收不收费这么一个问题, 真正需要关注的人是企业 IT 决策者 。一方面,个人开发者使用 Java 8 还是一样免费,还是一样可以获得更新支持;另一方面,所谓的收费,其实指的是在 2019 年 1 月之后的 更新 要收费支持,Java 8 本身就还是免费的,而要不要使用订阅模式去继续获得更新这是 IT 决策者要考虑的。
杨晓峰介绍:
付费的选项,除了 Oracle,还有其它厂商也提供了商业的 JDK 发行版,包括 Azul、IBM等,具体选择要看企业自己的判断。
不希望付费的用户,Java SE 9 以来,Oracle 也提供 Oracle 的 OpenJDK 发行版 ,基于 GPL v2 协议,总体免费更新周期比较短,AdoptOpenJDK 会提供更长期的免费支持。当然,也有个别厂商声明会提供长期的 JDK 8 更新,可以参考 Amazon Corretto。
同时我们也注意到,因为目前已经是 2019 年 1 月份,也就是到了 Java 8 免费更新结束的日子,有一些公司的响应也被公布出来,比如这个:
杨晓峰表示:“这个公告比较专业也比较谨慎,我认为 8u201/202 是最后的一个免费 Oracle JDK 8 更新。涉及到 License 相关的决策, 严格来说这不仅是个技术决定,更是个法务相关的决定 。”
使用订阅服务,花钱获得 Java 8 更新
花钱使用其它厂商提供的商业 JDK
选一个 OpenJDK 发行版迁移过去,由开源社区提供更新支持
保持在 8u201/202 或者之前版本
杨晓峰还强调:“授权(License)和付费是商业行为,是企业的 IT 决策,本就应该是由专业人士来做的,耐心、客观一些,不要被自媒体收智商税。”
其实 Oracle 早在 2017 年 9 月份就宣布改变 JDK 版本发布周期,这之后也陆续发布了 Java 10 与 11,12 也快要到来。
杨晓峰介绍,新的版本发布周期中,改变了以特性驱动的方式,变成 以时间驱动 版本变化。每 6 个月就会发布一个新的 Java 版本,也就是“大版本”,同时每 3 年会出现一个 LTS 版本,Java 11 作为这个新模式的第一个 LTS。
引用 相关材料 可以大概看到,新的版本周期与旧有模式的变化:
这其实是一件好事,而且也没有什么好困惑的。对于企业来说,技术栈的未来可预测性和可靠性是非常重要的,它可以保证研发投入的安全性和能力。对于 Java 来说,这一点其实也已经在过去 20 多年其生态圈的长期持续投入中获得了印证。
“Java 新的发布模式中,由于 LTS 的存在, 对于企业 IT 决策提供了清晰的指引 ”,杨晓峰表示:“与此同时,新的模式加快了新技术迭代和落地,以便更加敏捷地适应云计算等新浪潮,这事实上 提高了企业的参与度和生态活力 。”
既然 Java 11 新特性强悍,并且也是集万千关注,那为什么那么多人都不愿意从 Java 8 升级到 Java 11 呢? 直接不用 Java 8 的话,也就没有上边那些更新问题了 。
其实关于 Java 还有一件事情挺神奇的,在关于目前正在使用哪个版本的 Java 的各种大大小小的调查中,很多人都表示公司正在使用很落后的版本,管你 Java 11 最新特性多厉害,反正就是要坚守 Java 1.4、5.1……这是一种比较普遍的现象,实际上调查数据显示目 前 Java 8 是最被广泛使用的版本 。
对此杨晓峰认为软件升级本就不是一蹴而就的事,尤其是基础软件,就像 服务器 操作系统的升级,也是一个缓慢的过程,他解释:“虽然 Java 在兼容性上总体做得很好,但 升级总是需要人力等成本的,未必是企业的当务之急 。相信未来这种情况一定会持续下去。”
但是与之形成对比的是,除了这些“滞后”的现象,当然也有在相关方面积极投入的公司企业,比如谷歌、亚马逊与阿里等,与其被动接受变化,不如自己主动往前一步,去引导变化。杨晓峰以其所在的京东大数据平台部为例介绍:
京东大数据平台有业界少有的超大规模 Hadoop、Spark、Kafka 等集群,承载着海量的数据和计算负载,在 Java/JVM 领域有一些比较深入的工作,例如:
通过 JVM 层调优,不断获取通用性的计算资源效率提升,节省大量资源。例如,通过对 Spark Streaming 运行情况的深入分析,我们进行了 JVM 调优,在内存等计算资源减少 20% 的情况下,吞吐量还提高了 10+%。
对于 Java 相关代码实践的持续改进,提高研发、运维效率和产品质量。
通过对大数据基础引擎等代码层面优化,相对于开源社区产品,我们取得了大百分比甚至是倍数级别的性能等提升 。以 Kafka 为例,大数据中心团队通过 Profiling 技术,进行代码层面的一个深度改进,就使得吞吐量提高 40%,CPU 消耗降低 5%。整个集群 1400 多台,按照通常每台服务器 48 核/256 G 内存来计算,单是这个优化的经济效益就是千万级人民币。
因为并未刻意进行宣传,也许很少有人知道,我们已经签署了 OCA 协议,并积极参与到了 OpenJDK 等社区贡献中,目前已经贡献了若干性能和功能性的增强到 OpenJDK 等开源社区。
关于继续使用 Java 接下来将会面对一些什么,除了上边讲到的版本周期变化、商业支持方式改变和开源许可的变化等,其实还有一个方面值得关注,那就是技术上的东西: Java 当前的问题与未来的方向 。
Java 多年来在各个编程语言排行榜上一直是稳坐第一把交椅,但是最近有一些榜单上 Python 都已经走在 Java 之前,并且在逐渐拉开差距。这其中很大一部分原因可以归为 AI 以及相关的数据挖掘、分析等领域的快速崛起。
同时,另一方面,随着云时代不断发展,像 Golang 这样原生具有高并发、语法易学等各方面优势的语言也在不断壮大势力、完善能力。
那这就带来了问题: AI 与云计算等领域当下快速发展,会不会对 Java 造成冲击?Java 在这样的新时代可以与其它编程语言区分开的明显优势有哪些?
对于这些问题,杨晓峰认为目前 Java 庞大的生态系统 ,包括最庞大的开发者群体、海量的类库/工具等、主流厂商的参与和投入,都是其明显的优势。
比如据不完全统计,目前 Java 开发者超过了 1200W,活跃的 JVM 有 380 亿+,同时连接到云的 JVM 有 210 亿+。
很多人认为 Java 慢,但是杨晓峰反驳:“ 抛开场景说快慢是没有意义的 。”
他解释:“目前来说,长时间运行的服务器端场景下,Java 是处于没有争议的霸主地位的;而在微服务等新型架构下,Java/JVM 依然还是首选;并且,当前云计算时代,Java 也是 No.1 的编程语言,它覆盖了电商、大数据、企业软件、移动,甚至 IoT 等领域;此外,各个大公司也都在相关方面积极投入,包括但不限于谷歌、阿里、亚马逊、IBM、Oracle 与京东。”
除了这些优势,杨晓峰也坦言,目前 Java 还是有面临挑战的,“ 最大的问题在于 Java 是否能够快速地调整自己的能力,以保证在新场景下的竞争力 ”,他说:“排行榜/冲击都只是竞争的表现而已,能力才是更加重要的决定成败的关键因素,简单说就是——效率!效率!效率!”
在面对这些挑战的时候,Java 在不断改造自身,以适应新时代的需求,杨晓峰介绍 Java 现在快速演进的领域主要有:
更轻量级的 JVM,以适应云端应用需求。微服务与 Serverless 等都是短时间、轻量级的应用;
进一步增强数据密度、数据结构等基本能力的 value types 等;
变得更具开发效率的语法;
更具扩展性和更高开发效率的并发基础设施,如 Java 版协程 Fiber;
此外还有底层、硬件级别开发效率和能力急需的 Panama 等等。
总之,杨晓峰认为,在新时代,虽然还是需要不断跟进,不断去快速调整自己的能力,但是 Java 还是排在第一的编程语言,未来可期。