美团面试:Oracle JDK那么好,为何要用Open JDK?

发布时间 2023-10-22 20:01:26作者: 疯狂创客圈

文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 :

免费赠送 :《尼恩Java面试宝典》 持续更新+ 史上最全 + 面试必备 2000页+ 面试必备 + 大厂必备 +涨薪必备
免费赠送 :《尼恩技术圣经+高并发系列PDF》 ,帮你 实现技术自由,完成职业升级, 薪酬猛涨!加尼恩免费领
免费赠送 经典图书:《Java高并发核心编程(卷1)加强版》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领
免费赠送 经典图书:《Java高并发核心编程(卷2)加强版》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领
免费赠送 经典图书:《Java高并发核心编程(卷3)加强版》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领

免费赠送 资源宝库: Java 必备 百度网盘资源大合集 价值>10000元 加尼恩领取


美团面试:Oracle JDK那么好,为何要用Open JDK?

说在前面

在40岁老架构师 尼恩的读者交流群(50+)中,最近有小伙伴拿到了一线互联网企业如阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格,遇到很多很重要的面试题:

  • 既然 Oracle JDK 这么好,那为什么还要有 OpenJDK?

最近有小伙伴在面试美团,又遇到了相关的面试题。小伙伴懵了,因为JDK都是架构师定的, 他从来没有全面去了解过,支支吾吾的说了几句,面试官不满意,面试挂了。

所以,尼恩给大家做一下系统化、体系化的梳理,使得大家内力猛增,可以充分展示一下大家雄厚的 “技术肌肉”,让面试官爱到 “不能自已、口水直流”,然后实现”offer直提”。

当然,这道面试题,以及参考答案,也会收入咱们的 《尼恩Java面试宝典PDF》V118版本,供后面的小伙伴参考,提升大家的 3高 架构、设计、开发水平。

最新《尼恩 架构笔记》《尼恩高并发三部曲》《尼恩Java面试宝典》的PDF,请关注公众号【技术自由圈】获取,后台回复:领电子书

本文目录

面试官:既然 Oracle JDK 这么好,那为什么还要有 OpenJDK?

参考答案:

OpenJDK 项目主要基于 Sun 捐赠的 HotSpot 源代码。

对于 Java 7,没什么太多的区别:OpenJDK 被选为 Java 7 的参考实现,由 Oracle 工程师维护。

从Java 7开始 后面的版本, Oracle JDK 和 OpenJDK 的核心区别如下:

1 OpenJDK 是支持 开源的,遵守GPL开源协议

开源意味着 可以对它根据你自己的需要进行修改、优化,

比如 Alibaba 基于 OpenJDK 开发了 Dragonwell8: https://github.com/alibaba/dragonwell8

GPL是传染性协议,任何用了GPL开源协议的软件,都会被传染为强制开源,比如你用了某一个GPL开源协议的类库,那么用了该类库的所有代码,都必须开源,而且是用GPL开源协议开源,

OpenJDK 用的是GPL with Classpath Exception协议 ,有个尾巴 with Classpath Exception

这个尾巴 with Classpath Exception,又称为with linking exception,什么意思?就是用它们的模块,而不是去修改他的模块,就可以闭源发布。比如Java代码里面,常见的import语句,比如import java.*, javax.*, javafx.* etc.等等,这些都属于exception里面的,也就是说,你只是import这些类库,并且使用它们的话,不受GPL协议影响,你大可以在此基础之上,制作自己的软件,并且闭源发布。

什么情况下会被强制开源呢?很简单,你魔改了Open JDK的实现的话,比如你更改了java.base.jmod模块的源代码的话,那你的代码就会被GPL传染上,要求必需开源,否则就违背了Open JDK的开源协议,当初SUN这样做的目的很简单,就是为了防止出现不同版本的Java,否则IBM整一个Java,SUN整一个Java,互相之间代码还不兼容,那就麻烦大了,违背了Java最初的承诺,就是编译一次,四处运行。

开源许可协议GPL、APL、BSD、LGPL、MIT等的区别

开源软件的授权许可都是基于开源许可协议的,常见的开源许可协议有GPL、LGPL、APL、BSD、MIT、Mozilla Public License、Creative Commons、Eclipse Public License 1.0等。它们之前有很多相同的地方,也有很多不同的地方,本文将分析一下这些协议之间的区别。

GPL(GNU General Public License),使用源软件的类库引用(源代码)、改变(修改了源代码)的新软件,也必须采用GPL进行授权。就是说,只要使用了GPL开源软件的源代码或拿它的源代码进行了修改而编写的新的软件,也必须加入到GPL的阵营。很明显,不能拿GPL授权的开源东东来做商业软件。这个协议有个好处,就是极大增加了使用GPL的软件的数量。采用GPL授权的软件有:Linux、MySQL等。

LGPL(Lesser GPL),相比GPL的严格,LGPL要温和很多。可以通过引用类库的方式(不是直接使用源代码)拿LGPL授权的东东来重新开发商业软件。如果是要修改源代码,是相应的修改和衍生出来的代码都要使用LGPL开放源代码。采用LGPL的软件有:JBoss、Hibernate、FCKeditor等。

APL(apache Licence vesion 2.0),适用于商业软件,允许修改代码后再发布(不用开放源代码)。采用APL的软件有Hadoop、Apache HttpServer等。

BSD(Berkeley Software Distribution),这个协议的要求很宽松,允许他人修改和重新发布代码,可以在此基础上开发出商业软件进行销售。所以,此协议适用于商业软件。采用BSD协议的软件最著名的有nginx。

MIT(Massachusetts Institute of Technology),又称X11协议。MIT与BSD类似,但是比BSD协议更加宽松,算是目前限制最少的协议了。这个协议唯一的条件就是在修改后的代码或者发行包包含原作者的许可信息。适用商业软件。采用MIT的软件有:jquery、Node.js

还有关于Mozilla Public License、Creative Commons、Eclipse Public License 1.0等协议,这里就不一一介绍了。

2 Oracle JDK 是商业免费的,并不是开源的

另外,虽然 Oracle JDK 也是商业免费(比如 JDK 8),但并不是所有版本都是免费的。

这也是为什么: linux 通过 yum 包管理器上默认安装的 JDK 是 OpenJDK 而不是 Oracle JDK。

Oracle JDK Open JDK
是否开源 完全开源 部分开源
是否免费 部分免费,部分商用
功能 基本一致 基本一致
稳定性 提供 LTS(Log Tank Service)服务
协议 BCL/OTN 协议 GPL v2

Oracle JDK各个版本所用的协议:

Oracle JDK版本 BCL协议 OTN协议
6 最后一个公共更新6u45之前
7 最后一个公共更新7u80之前
8 8u201/8u202之前 8u211/8u212之后
9
10
11
12

BCL 协议(Oracle Binary Code License Agreement): 可以使用 JDK(支持商用),但是不能进行修改。

OTN 协议(Oracle Technology Network License Agreement): 11 及之后新发布的 JDK 用的都是这个协议,可以自己私下用,但是商用需要付费。

3 OpenJDK 是试错角色、炮灰角色,快速更新,为 Oracle JDK LTS版本打冲锋陷阵

OpenJDK的特点是更新频繁,实现快速迭代和高效试错,为Oracle JDK LTS版本打下基础。

Oracle JDK 一般是每 6 个月发布一个新版本,而 OpenJDK 一般是每 3 个月发布一个新版本。

为啥 Oracle JDK 更稳定了吧,先在 OpenJDK 试试水,把大部分问题都解决掉了才在 Oracle JDK 上发布)

基于以上这些原因, OpenJDK 还是有存在的必要的!

上面这个问题,oracle 官方也回答过,大致如下:

官方答疑: OpenJDK 存储库中的源代码与用于构建 Oracle JDK 的代码之间有什么区别?

答:非常接近。

我们的 Oracle JDK 版本构建过程基于 OpenJDK 7 构建,只添加了几个部分,例如部署代码,其中包括 Oracle 的 Java 插件和 Java WebStart 的实现,以及一些闭源的第三方组件,如图形光栅化器,一些开源的第三方组件,如 Rhino,以及一些零碎的东西,如附加文档或第三方字体。展望未来,我们的目的是开源 Oracle JDK 的所有部分,除了我们考虑商业功能的部分。

  1. Oracle JDK 大概每 6 个月发一次主要版本(从 2014 年 3 月 JDK 8 LTS 发布到 2017 年 9 月 JDK 9 发布经历了长达 3 年多的时间,所以并不总是 6 个月),而 OpenJDK 版本大概每三个月发布一次。但这不是固定的,我觉得了解这个没啥用处。详情参见: https://blogs.oracle.com/java-platform-group/update-and-faq-on-the-java-se-releasecadence

  2. OpenJDK 是一个参考模型并且是完全开源的,而 Oracle JDK 是 OpenJDK 的一个实现,并不是完全开源的;(个人观点:众所周知, JDK 原来是 SUN 公司开发的,后来 SUN 公司又卖给了 Oracle 公司, Oracle 公司以 Oracle 数据库而著名,而 Oracle 数据库又是闭源的,这个时候Oracle 公司就不想完全开源了,但是原来的 SUN 公司又把 JDK 给开源了,如果这个时候Oracle 收购回来之后就把他给闭源,必然会引其很多 Java 开发者的不满,导致大家对 Java 失去信心,那 Oracle 公司收购回来不就把 Java 烂在手里了吗!然后, Oracle 公司就想了个骚操作,这样吧,我把一部分核心代码开源出来给你们玩,并且我要和你们自己搞的 JDK 区分下,你们叫 OpenJDK,我叫 Oracle JDK,我发布我的,你们继续玩你们的,要是你们搞出来什么好玩的东西,我后续发布 Oracle JDK 也会拿来用一下,一举两得!) OpenJDK 开源项目: https://github.com/openjdk/jdk

  3. Oracle JDK 比 OpenJDK 更稳定(肯定啦, Oracle JDK 由 Oracle 内部团队进行单独研发的,而且发布时间比 OpenJDK 更长,质量更有保障)。 OpenJDK 和 Oracle JDK 的代码几乎相同(OpenJDK 的代码是从 Oracle JDK 代码派生出来的,可以理解为在 Oracle JDK 分支上拉了一条新的分支叫 OpenJDK,所以大部分代码相同),但 Oracle JDK 有更多的类和一些错误修复。因此,如果您想开发企业/商业软件,我建议您选择 Oracle JDK,因为它经过了彻底的测试和稳定。某些情况下,有些人提到在使用 OpenJDK 可能会遇到了许多应用程序崩溃的问题,但是,只需切换到 Oracle JDK 就可以解决问题;

  4. 在响应性和 JVM 性能方面, Oracle JDK 与 OpenJDK 相比提供了更好的性能;

  5. Oracle JDK 不会为即将发布的版本提供长期支持(如果是 LTS 长期支持版本的话也会,比如JDK 8,但并不是每个版本都是 LTS 版本),用户每次都必须通过更新到最新版本获得支持来获取最新版本;

  6. Oracle JDK 使用 BCL/OTN 协议获得许可,而 OpenJDK 根据 GPL v2 许可获得许可。

说在最后

JVM 面试题,是非常常见的面试题。

以上的内容,如果大家能对答如流,如数家珍,基本上 面试官会被你 震惊到、吸引到。

在面试之前,建议大家系统化的刷一波 5000页《尼恩Java面试宝典PDF》,并且在刷题过程中,如果有啥问题,大家可以来 找 40岁老架构师尼恩交流。

最终,让面试官爱到 “不能自已、口水直流”。offer, 也就来了。

技术自由的实现路径:

实现你的 架构自由:

吃透8图1模板,人人可以做架构

10Wqps评论中台,如何架构?B站是这么做的!!!

阿里二面:千万级、亿级数据,如何性能优化? 教科书级 答案来了

峰值21WQps、亿级DAU,小游戏《羊了个羊》是怎么架构的?

100亿级订单怎么调度,来一个大厂的极品方案

2个大厂 100亿级 超大流量 红包 架构方案

… 更多架构文章,正在添加中

实现你的 响应式 自由:

响应式圣经:10W字,实现Spring响应式编程自由

这是老版本 《Flux、Mono、Reactor 实战(史上最全)

实现你的 spring cloud 自由:

Spring cloud Alibaba 学习圣经》 PDF

分库分表 Sharding-JDBC 底层原理、核心实战(史上最全)

一文搞定:SpringBoot、SLF4j、Log4j、Logback、Netty之间混乱关系(史上最全)

实现你的 linux 自由:

Linux命令大全:2W多字,一次实现Linux自由

实现你的 网络 自由:

TCP协议详解 (史上最全)

网络三张表:ARP表, MAC表, 路由表,实现你的网络自由!!

实现你的 分布式锁 自由:

Redis分布式锁(图解 - 秒懂 - 史上最全)

Zookeeper 分布式锁 - 图解 - 秒懂

实现你的 王者组件 自由:

队列之王: Disruptor 原理、架构、源码 一文穿透

缓存之王:Caffeine 源码、架构、原理(史上最全,10W字 超级长文)

缓存之王:Caffeine 的使用(史上最全)

Java Agent 探针、字节码增强 ByteBuddy(史上最全)

实现你的 面试题 自由:

4800页《尼恩Java面试宝典 》 40个专题

免费获取11个技术圣经PDF: