首页 > 数据库 >OpenJDK和Oracle JDK有什么区别和联系?

OpenJDK和Oracle JDK有什么区别和联系?

时间:2023-06-19 12:33:06浏览次数:53  
标签:Java JDK SUN OpenJDK Oracle 源代码


《Linux 7安装Oracle 11g打怪经历》的安装过程中,启动图形界面,需要指定jre路径,当时使用yum install jdk安装的,并不能解决问题,查看版本才知道他是OpenJDK,最终使用Oracle JDK,才解决的问题,那OpenJDK和Oracle JDK究竟有什么区别?

OpenJDK

Java最早由SUN公司(Sun Microsystems,发起于美国斯坦福大学,SUN是Stanford University Network的缩写)发明,2006年SUN公司将Java开源,此时的JDK即为OpenJDK。

OpenJDK是Java SE的开源实现,他由SUN和Java社区提供支持,2009年Oracle收购了Sun公司,自此Java的维护方之一的SUN也变成了Oracle。

大多数JDK都是在OpenJDK的基础上编写实现的,比如IBM J9,Azul Zulu,Azul Zing和Oracle JDK。几乎现有的所有JDK都派生自OpenJDK,他们之间不同的是许可证,

OpenJDK根据许可证GPL v2发布。
Oracle JDK根据Oracle二进制代码许可协议获得许可。

Oracle JDK

Oracle JDK之前被称为SUN JDK,显而易见,这是在2009年Oracle收购SUN公司之前,收购后被命名为Oracle JDK。

实际上,Oracle JDK是基于OpenJDK源代码构建的,因此Oracle JDK和OpenJDK之间没有重大的技术差异。

某次大会上,曾用下图证实了OpenJDK 7和Oracle JDK 7在程序上是非常接近的,两者共用了大量相同的代码,图中提示了两者共同代码的占比要远高于图形上看到的比例,所以我们编译的OpenJDK基本上可以认为性能、功能和执行逻辑上都和官方的Oracle JDK是一致的,

OpenJDK和Oracle JDK有什么区别和联系?_java

两者区别

再粗暴些地说,OpenJDK是开源的,Oracle JDK是官方的,从网站就能看出一些端倪,OpenJDK界面如此粗糙(http://openjdk.java.net/),朋友们可能从中看出了SUN的影子,

OpenJDK和Oracle JDK有什么区别和联系?_Server_02

命令行中使用java -version,可以看到JDK的版本,如果是Oracle JDK,会显示,

[root@localhost ~]# java -version
java version "1.7.0_79"
Java(TM) SE Runtime Environment (build 1.7.0_79-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.79-b02, mixed mode)

其中Java HotSpot(TM) 64-Bit Server VM表明,此JDK的JVM是Oracle的64位HotSpot虚拟机,运行在Server模式下。Java(TM) SE Runtime Environment (build 1.8.0_162-b12)是Java运行时环境(即JRE)的版本信息。

如果是OpenJDK,会显示,

[root@localhost ~]# java -version
openjdk version "11-ea" 2018-09-25
OpenJDK Runtime Environment (build 11-ea+28)
OpenJDK 64-Bit Server VM (build 11-ea+28, mixed mode, sharing)

主要的Linux发行版(例如这些常见的Ubuntu、Fedora和Red Hat Enterprise Linux)提供OpenJDK或其变体作为系统默认的Java SE的实现。解释了为什么在文章开始,提到使用yum install jdk安装成的是OpenJDK。

另外几点不同,

授权协议的不同:OpenJDK采用GPL V2协议放出,而Oracle JDK则采用JRL放出。两者协议虽然都是开放源代码的,但是在使用上的不同在于GPL V2允许在商业上使用,而JRL只允许个人研究使用。OpenJDK不包含Deployment(部署)功能:部署的功能包括:Browser Plugin、Java Web Start、以及Java控制面板,这些功能在OpenJDK中是找不到的。

OpenJDK源代码不完整:这个很容易想到,在采用GPL协议的OpenJDK中,SUN JDK的一部分源代码因为产权的问题无法开放给OpenJDK使用,其中最主要的部份就是JMX中的可选元件SNMP部份的代码。因此这些不能开放的源代码 将它作成plug,以供OpenJDK编译时使用,你也可以选择不要使用plug。而Icedtea则为这些不完整的部分开发了相同功能的源代码 (OpenJDK6),促使OpenJDK更加完整。

部分源代码用开源代码替换:由于产权的问题,很多产权不是SUN的源代码被替换成一些功能相同的开源代码,比如说字体栅格化引擎,使用Free Type代替。

OpenJDK只包含最精简的JDK:OpenJDK不包含其他的软件包,比如Rhino Java DB JAXP...,并且可以分离的软件包也都是尽量的分离,但是这大多数都是自由软件,你可以自己下载加入。

不能使用Java商标:这个很容易理解,在安装OpenJDK的机器上,输入“java -version”显示的是OpenJDK,但是如果是使用Icedtea补丁的OpenJDK,显示的是java。

StackOverflow上的这篇文章《What is the difference between JVM, JDK, JRE & OpenJDK?》,可以说各路大神回答了关于JVM、JDK、JRE和OpenJDK之间区别的问题,其中有个人的回答言简意赅,

OpenJDK is an open source version of sun JDK. Oracle JDK is Sun's official JDK.

另外,这篇文章《Update for JDK 11 - An article from Donald Smith try to disambiguate the difference between Oracle JDK and Oracle's OpenJDK》,介绍了更新版本Oracle JDK和OpenJDK的区别,有兴趣的朋友,可以拜读。其中非常有意思的是这篇文章的博主,是Insights and updates on Java SE and OpenJDK from the Java Platform Group Product Management Team,

OpenJDK和Oracle JDK有什么区别和联系?_java_03

竟然有这种团队,说明Oracle JDK和OpenJDK并不是绝对的竞争对手,他们的存在还是有意义的,这就是所谓“存在即合理”。

参考文章:


https://www.zhihu.com/question/19646618/answer/40621705

https://stackoverflow.com/questions/11547458/what-is-the-difference-between-jvm-jdk-jre-openjdk

https://blogs.oracle.com/java-platform-group/oracle-jdk-releases-for-java-11-and-later

标签:Java,JDK,SUN,OpenJDK,Oracle,源代码
From: https://blog.51cto.com/u_13950417/6512400

相关文章

  • Linux 7安装Oracle 11g打怪经历
    最近接到个需求,要将一套开发环境中Linux6平台的Oracle11g,迁移到两套Linux7平台,原以为很简单,但过程中,确实历经坎坷,就像过山车一般,解决这个问题,又碰到下一个。软件信息RedHatLinux7.5Oracle11.2.0.4坑坑坑1.软链接为了安装路径的标准和简便,可以使用软链接,语法如下,ln-s【目标......
  • 非Oracle Linux下Oracle 19c CDB数据库安装
    《非OracleLinux下安装Oracle19c》我们安装了non-cdb的19c数据库,通过这个脚本,还可以搭建cdb的数据库。1.修改安装脚本cp/etc/init.d/oracledb_ORCLCDB-19c/etc/init.d/oracledb_pdbisal-19c其中要改几处,ORACLE_SID改成新的,LISTENER_NAME改成新的,CREATE_AS_CDB之前我写的false,......
  • Oracle优化器对谓词顺序处理的一个场景
    最近听了个讲座,其中介绍到了Oracle的谓词,原始版本的例子,如下所示,从数据上能看到,c1='3'的时候,c2的值是个字符串类型的数字,SQL>createtabletest(c1char(1),c2varchar2(1));Tablecreated.SQL>insertintotestvalues('1','A');1rowcreated.SQL>insertintotes......
  • 即将“再次”免费的JDK
    OracleJDK,从jdk-8u201开始,就改成收费了,《JDK的版本号解惑Thenewlicensepermitscertainuses,suchaspersonaluseanddevelopmentuse,atnocost--butotherusesauthorizedunderpriorOracleJDKlicensesmaynolongerbeavailable.注意到JDK8这提到了两个8u211......
  • Windows调试Oracle数据库问题的一些手段
    最近需要在Windows的跳板机上访问远程的Oracle数据库进行调试。Windows中只有个精简版OracleClient,以及PLSQLDeveloper客户端。如果用惯了Linux,再用Windows,确实不知所措。但这就是个从生疏到熟练的事儿,最近看的一本书中描述得很恰当,Themosteffectivewaytodealwithaworry......
  • 《Oracle Concept》第三章 - 4
    背景:按照《OracleConecpt》的结构一起了解Oracle数据库,这是学习Oracle从入门到精通的基础。本文主题:第三章《IndexesandIndex-OrganizedTables》-OverviewofIndexes。B树索引B树索引,是平衡树的缩写,他是数据库索引中最常用的一种类型。一个B树索引是一种将数值有序划分到不......
  • 为什么jdk1.7的HashMap会产生死循环?
    前言JDK1.7中的HashMap在多线程情况下扩容可能会导致死循环。本文就这个问题进行讲解。扩容死循环这里回顾一下HashMap1.7扩容的过程,在扩容过程中,单链表的表现,相关的代码如下:Jdk1.7:voidresize(intnewCapacity){Entry[]oldTable=table;intoldCapacity=......
  • oracle固定执行计划
    文档课题:oracle固定执行计划.本文介绍oracle固定执行计划的2种方法,outline,SQLProfile,其中SQLProfile是重点。1、outline1.1、相关概念开发环境中SQL的执行无问题,但在生产环境执行效率却异常缓慢。若此时更改SQL需重新修改及编译源程序,成本非常高。此时可使用outline在不改变......
  • ORACLE如何找出视图依赖的对象和视图嵌套层数
    之前写过一篇文章“SQLServer如何找出视图依赖的对象和视图嵌套层数”,这里我介绍一下Oracle数据库中如何找出视图的依赖对象以及视图嵌套层数关系。主要通过DBA_DEPENDENCIES这个系统视图(这个系统视图中包含有对象的依赖关系数据)。另外,我们使用了Oracle的树形查询(层级查询)来展示这......
  • 在 Cenntos6.8 下安装 Oracle11g
    安装所需文件如下1.一台装有CentOS 6.8x64的服务器(虚拟机也可)2. linux.x64_11gR2_database_1of2.zip3.linux.x64_11gR2_database_2of2.zip"系统要求如下1.SWAP分区大于3G1.Oracle安装目录剩余空间大于20G2.Centos6.x系统安装centos系统首先我们要安装一个带Xwi......