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

news2024/12/19 22:02:30

说在前面

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

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

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

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

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

最新《尼恩 架构笔记》《尼恩高并发三部曲》《尼恩Java面试宝典》的PDF,请关注本公众号【技术自由圈】获取

文章目录

    • 说在前面
    • 面试官:既然 Oracle JDK 这么好,那为什么还要有 OpenJDK?
      • 1 OpenJDK 是支持 开源的,遵守GPL开源协议
      • 2 Oracle JDK 是商业免费的,并不是开源的
      • 3 OpenJDK 是试错角色、炮灰角色,快速更新,为 Oracle JDK LTS版本打冲锋陷阵
    • 官方答疑: OpenJDK 存储库中的源代码与用于构建 Oracle JDK 的代码之间有什么区别?
    • 说在最后
    • 推荐阅读

面试官:既然 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 JDKOpen JDK
是否开源完全开源部分开源
是否免费部分免费,部分商用
功能基本一致基本一致
稳定性提供 LTS(Log Tank Service)服务
协议BCL/OTN 协议GPL v2

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

Oracle JDK版本BCL协议OTN协议
6最后一个公共更新6u45之前
7最后一个公共更新7u80之前
88u201/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, 也就来了。

推荐阅读

《百亿级访问量,如何做缓存架构设计》

《多级缓存 架构设计》

《消息推送 架构设计》

《阿里2面:你们部署多少节点?1000W并发,当如何部署?》

《美团2面:5个9高可用99.999%,如何实现?》

《网易一面:单节点2000Wtps,Kafka怎么做的?》

《字节一面:事务补偿和事务重试,关系是什么?》

《网易一面:25Wqps高吞吐写Mysql,100W数据4秒写完,如何实现?》

《亿级短视频,如何架构?》

《炸裂,靠“吹牛”过京东一面,月薪40K》

《太猛了,靠“吹牛”过顺丰一面,月薪30K》

《炸裂了…京东一面索命40问,过了就50W+》

《问麻了…阿里一面索命27问,过了就60W+》

《百度狂问3小时,大厂offer到手,小伙真狠!》

《饿了么太狠:面个高级Java,抖这多硬活、狠活》

《字节狂问一小时,小伙offer到手,太狠了!》

《收个滴滴Offer:从小伙三面经历,看看需要学点啥?》

《尼恩 架构笔记》《尼恩高并发三部曲》《尼恩Java面试宝典》PDF,请到下面公号【技术自由圈】取↓↓↓

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1121602.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

YZ系列工具之YZ12:VBA_4种方法设计下拉列表

我给VBA下的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。我的教程一共九套一部VBA手册,教程分为初级、中级、高级三大部分。是对VBA的系统讲解,从简单的…

OJ第五篇

文章目录 用队列实现栈用栈实现队列设计循环队列 用队列实现栈 链接:用队列实现栈 这道题是让我们用两个队列实现一个栈,简单来说,就是利用队列来实现一个先入后出的功能,我们知道队列是先入先出,如何用两个队列来实…

Vue2基础知识(四) 自定义指令

目录 一 自定义指令1.1 定义1.2 自定义局部指令1.3 全局注册指令1.4 钩子函数1.5 动态传参1.6 使用场景 💌 所属专栏:【Vue2】😀 作 者:长安不及十里💻工作:目前从事电力行业开发🌈目标&#xf…

全国342个城市往返最短通勤时间(铁路)数据

全国342个城市往返最短通勤时间(铁路)数据 1、时间:采集时间是2022年 2、来源:12306 3、数据说明:数据采集12306数据,整理全国342个城市往返最短通勤时间,本数据是铁路包含动车、高铁所有路线…

【GESP】2023年06月图形化三级 -- 计算最终值

文章目录 计算最终值【题目描述】【输入描述】【输出描述】【参考答案】其他测试用例 计算最终值 【题目描述】 默认小猫角色,白色背景。存在一种仅支持2种操作和1个变量的编程语言: X 使变量 “X” 的值增加1X-- 使变量 “X” 的值减少 1 最初&#…

基于SAE堆叠自编码器的单维时间序列预测研究(matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

在没有康托尔对角化方法的情况下证明实数的不可数性

乔治康托尔 |图片来源: 维基百科 一、说明 对于那些对数学感兴趣的人来说,无穷大实际上可以有不同的大小,这可能是一个众所周知的事实。事实上,最著名的例子是所有实数的集合比所有自然数的集合“大”。你可能知道,这实…

Docker部署SpringBoot +Vue项目流程详解(含域名 + HTTPS)

文章目录 前言1、选购服务器2、部署 Docker3、前端、后端项目打包4、配置 Dockerfile5、配置 Nginx6、配置 DockerCompose6、启动 DockerCompose 完成部署7、【可选】域名 SSL证书 前言 本次整体部署操作使用阿里云服务器,这里我选择的是香港地区的2核2G ECS&…

打击勒索病毒:防御.kat6.l6st6r勒索病毒的最佳策略

导言: 我们日常生活和工作的方方面面都离不开数字化,但这也意味着面临日益复杂的网络威胁。.kat6.l6st6r勒索病毒就是其中之一,如果你的计算机感染了这种恶意软件,你的数据可能会遭到加密并要求支付赎金才能解锁。在这篇终极指南…

STM32F4_音乐播放器

目录 前言 1. WAV简介 1.1 WAVE文件的内部结构 2. WM8978简介 3. I2S简介 4. 硬件设计 5. 实验程序 5.1 main.c 5.2 I2S.c 5.3 I2S.h 5.4 WM8978.c 5.5 WM8978.h 前言 STM32F4开发板拥有全双工I2S(也就是可以同时双向进行传输,A到B传输信息的…

强化学习问题(7)--- Python和Pytorch,Tensorflow的版本对应

1.问题 之前下载的python3.8,在对应Pytorch和Tensorflow时没太在意版本,在运行一些代码时,提示Pytorch和Tensorflow版本过高,直接降下来,有时候又和Python3.8不兼容,所以又在虚拟环境搞一个Pyhon3.7&#x…

Brachistochrone:使用变分法找到最快下降曲线

一、说明 对于任何对数学和科学感兴趣的人,您可能已经知道了急速线,因为它经常在各种流行的教学频道(例如 Vsauce 和 3Blue1Brown)上谈论。虽然有多种方法可以解决急速线问题,但在这篇文章中,本文将使用变分…

【C++】哈希应用——海量数据面试题

哈希应用——海量数据面试题 一、位图应用1、给定100亿个整数,设计算法找到只出现一次的整数?2、给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集?(1)用一个位图…

Mac安装nginx(Homebrew)

查看需要安装 nginx 的信息 brew info nginxDocroot 默认为 /usr/local/var/www 在 /opt/homebrew/etc/nginx/nginx.conf 配置文件中默认端口被配置为8080,从而使 nginx 运行时不需要加 sudo nginx将在 /opt/homebrew//etc/nginx/servers/ 目录中加载所有文件 …

Springboot+vue的学生考勤管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频: Springbootvue的学生考勤管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。 项目介绍: 本文设计了一个基于Springbootvue的前后端分离的学生考勤管理系统,采用M(model&a…

Gin框架--参数接收函数

1.get 请求 穿参数 #根据返回的bool 判断是否正确传值 _p, err : c.GetQuery("pkg") if !err {p.ReError(c, http.StatusBadRequest, "params pkg empty", "")return} #默认值接收方法_p : c.DefaultQuery("pkg", "hmf") …

【java计算机毕设】高校奖学金管理系统 java springmvc vue mysql 送文档+ppt

目录 1.项目功能截图 2.项目简介 3.源码下载地址 1.项目功能截图 2.项目简介 ssm奖学金系统 医院系统 idea mysql5.7/8 tomcat8 html jdk1.8 奖学金管理系统。基于SpringBootVue框架开发,方便学生直观得查看学校奖学金的评选时间、评选资格和评选内容&#xff0…

C语言学习系列->动态内存管理

文章目录 前言概述🚩malloc and free🔜malloc🔜free 🚩calloc and realloc🔜calloc🔜realloc 前言 要想学好数据结构,在C语言学习过程中就需要把指针、结构体和动态内存管理学好。在前面的文章&…

2006-2019年全国30省绿色创新效率、绿色投资效率:基于SBM-DEA测算面板数据(数据+Stata代码)

1、来源:各省年鉴、统计局、科技年鉴 2、时间:2006-2019 3、范围:全国 30 个省份 4、指标: 原始数据指标:R&D 全时人员当量 (万人年)、R&D 资本存量 (亿元;利用以 1999 年为初期永续存量法&a…

css之Flex弹性布局(父项常见属性)

文章目录 🐕前言:🏨定义flex容器 display:flex🏨在flex容器中子组件进行排列🪂行排列 flex-direction: row🪂将行排列进行翻转排列 flex-direction: row-reverse🏅按列排列 flex-direction: col…