openjdk和oraclejdk有啥区别吗
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了openjdk和oraclejdk有啥区别吗相关的知识,希望对你有一定的参考价值。
我去,怎么就一个机器人帮我回答,好尴尬
首先要先明确之间,以及OpenJDK 6、OpenJDK 7、OpenJDK 7u和OpenJDK 8等项目之间是什么关系,这有助于确定接下来编译要使用的JDK版本和源码分支。从前面介绍的Java发展史中我们了解到OpenJDK是Sun在2006年末把Java开源而形成的项目,这里的“开源”是通常意义上的源码开放形式,即源码是可被复用的,例如IcedTea、UltraViolet都是从OpenJDK源码衍生出的发行版。但如果仅从“开源”字面意义(开放可阅读的源码)上看,其实Sun自JDK 1.5之后就开始以Java Research License(JRL)的形式公布过Java源码,主要用于研究人员阅读(JRL许可证的开放源码至JDK 1.6 Update 23为止)。把这些JRL许可证形式的Sun/OracleJDK源码和对应版本的OpenJDK源码进行比较,发现除了文件头的版权注释之外,其余代码基本上都是相同的,只有字体渲染部分存在一点差异,Oracle JDK采用了商业实现,而OpenJDK使用的是开源的FreeType。当然,“相同”是建立在两者共有的组件基础上的,Oracle JDK中还会存在一些Open JDK没有的、商用闭源的功能,例如从JRockit移植改造而来的Java Flight Recorder。预计以后JRockit的MissionControl移植到HotSpot之后,也会以Oracle JDK专有、闭源的形式提供。
Oracle的项目发布经理Joe Darcy在OSCON 2011上对两者关系的介绍也证实了OpenJDK 7和Oracle JDK 7在程序上是非常接近的,两者共用了大量相同的代码(如下图,注意图中提示了两者共同代码的占比要远高于图形上看到的比例),所以我们编译的OpenJDK,基本上可以认为性能、功能和执行逻辑上都和官方的Oracle JDK是一致的。
Dalvik 与java虚拟机:
1.java虚拟机基于栈。 基于栈的机器必须使用指令来载入和操作栈上数据,所需指令更多更多 .
而dalvik虚拟机是基于寄存器的:java虚拟机运行的是java字节码。
(java类会被编译成一个或多个字节码.class文件,打包到.jar文件中,java虚拟机从相应的.class文件和.jar文件中获取相应的字节码)2.Dalvik和Java之间的另外一大区别就是运行环境——Dalvik经过优化,允许在有限的内存中同时运行多个虚拟机的实例OpenJDK :
[root@localhost ~]# java -version
java version "1.6.0_39"
OpenJDK Runtime Environment (IcedTea6 1.13.11) (rhel-1.13.11.0.el5_11-x86_64)OpenJDK 64-Bit Server VM (build 23.25-b01, mixed mode)oracle jdk:
java version "1.8.0_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b14)Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)OpenJDK下载:
http://openjdk.java.net/install/index.htmlJDK 8:yum install java-1.8.0-openjdk
JDK 7:
yum install java-1.7.0-openjdk
JDK 6:yum install java-1.6.0-openjdk
1. HotSpot历史
SUN的JDK版本从1.3.1开始运用HotSpot虚拟机, 2006年底开源,主要使用C++实现,JNI接口部分用C实现。
HotSpot是较新的Java虚拟机,用来代替JIT(Just in Time),可以大大提高Java运行的性能。
Java原先是把源代码编译为字节码在虚拟机执行,这样执行速度较慢。而HotSpot将常用的部分代码编译为本地(原生,native)代码,这样显着提高了性能。
HotSpot JVM 参数可以分为规则参数(standard options)和非规则参数(non-standard options)。
规则参数相对稳定,在JDK未来的版本里不会有太大的改动。
非规则参数则有因升级JDK而改动的可能。
规则和非规则参数这里不做介绍了,网上资料很多。
2.HotSpot基础知识
HotSpot包括一个解释器和两个编译器(client 和 server,二选一的),解释与编译混合执行模式,默认启动解释执行。
编译器:java源代码被编译器编译成class文件(字节码),java字节码在运行时可以被动态编译(JIT)成本地代码(前提是解释与编译混合执行模式且虚拟机不是刚启动时)。
解释器: 解释器用来解释class文件(字节码),java是解释语言(书上这么说的)。
server启动慢,占用内存多,执行效率高,适用于服务器端应用;client启动快,占用内存小,执行效率没有server快,默认情况下不进行动态编译,适用于桌面应用程序。
由-XX:+RewriteFrequentPairs参数控制 client模式默认关闭,server模式默认开启在jre安装目录下的lib/i386/jvm.cfg 文件下。
java -version
Java HotSpot(TM) Client VM (build 14.3-b01, mixed mode, sharing)mixed mode 解释与编译 混合的执行模式 默认使用这种模式java -Xint -version
Java HotSpot(TM) Client VM (build 14.3-b01, interpreted mode, sharing)interpreted 纯解释模式 禁用JIT编译
java -Xcomp -version
Java HotSpot(TM) Client VM (build 14.3-b01, compiled mode, sharing)compiled 纯编译模式(如果方法无法编译,则回退到解释模式执行无法编译的方法)3.动态编译
动态编译(compile during run-time),英文称Dynamic compilation;Just In Time也是这个意思。
HotSpot对bytecode的编译不是在程序运行前编译的,而是在程序运行过程中编译的。
HotSpot里运行着一个监视器(Profile Monitor),用来监视程序的运行状况。
java字节码(class文件)是以解释的方式被加载到虚拟机中(默认启动时解释执行)。 程序运行过程中,那一部分运用频率大,那些对程序的性能影响重要。对程序运行效率影响大的代码,称为热点(hotspot),HotSpot会把这些热点动态地编译成机器码(native code),同时对机器码进行优化,从而提高运行效率。对那些较少运行的代码,HotSpot就不会把他们编译。
HotSpot对字节码有三层处理:不编译(字节码加载到虚拟机中时的状态。也就是当虚拟机执行的时候再编译),编译(把字节码编译成本地代码。虚拟机执行的时候已经编译好了,不要再编译了),编译并优化(不但把字节码编译成本地代码,而且还进行了优化)。
至于那些程序那些不编译,那些编译,那些优化,则是由监视器(Profile Monitor)决定。
4.为什么不静态编译那?
为什么字节码在装载到虚拟机之前就编译成本地代码那?
动态编译器也在许多方面比静态编译器优越。静态编译器通常很难准确预知程序运行过程中究竟什么部分最需要优化。
函数调用都是很浪费系统时间的,因为有许多进栈出栈操作。因此有一种优化办法,就是把原来的函数调用,通过编译器的编译,改成非函数调用,把函数代码直接嵌到调用出,变成顺序执行。
面向对象的语言支持多态,静态编译无效确定程序调用哪个方法,因为多态是在程序运行中确定调用哪个方法。
jdk 1.9 等价JDK9 J2SE9 JAVA9
jdk 1.8 等价JDK8 J2SE8 JAVA8
jdk 1.7 等价JDK7 J2SE7 JAVA7
jdk 1.6 等价JDK6 J2SE6 JAVA6
jdk 1.5 等价JDK5 J2SE5 JAVA5
jdk 1.4 等价J2SE1.4
jdk 1.3 等价J2SE1.3
jdk 1.2 等价J2SE1.2
jdk 1.1
openjdk源码下载:
Oracle JDK只发布二进制安装包,而OpenJDK只发布源码复制代码
获取OpenJDK源码有两种方式:
第一种方式:
下载OpenJDK7u的源代码:
hg clone http://hg.openjdk.java.net/jdk7u/jdk7u-devcd jdk7u-dev
chmod 755 get_source.sh
./get_source.sh
下载OpenJDK8u的源代码:
hg clone http://hg.openjdk.java.net/jdk8u/jdk8u-devcd jdk8u-dev
./get_source.sh
注意:这是最直接的方式,从版本管理中看变更轨迹比看Release Note效果更好。但不足之处是速度太慢,虽然代码总容量只有300 MB左右,但是文件数量太多,在笔者的网络下全部复制到本地需要数小时。
第二种方式,即直接下载官方打包好的源码包
读者可以从Source Bundle Releases页面(地址:http://jdk7.java.net/source.html)取得打包好的源码,到本地直接解压即可。
一般来说,源码包大概一至两个月左右会更新一次,虽然不够及时,但比起从Mercurial复制代码的确方便和快捷许多。
笔者下载的是OpenJDK 7 Update 6 Build b21版源码包,2012年8月28日发布,大概99MB,解压后约为339MB。
备注:推荐在linux平台或者mac平台上面编译jdk 参考技术A
1.授权协议的不同:OpenJDK采用GPL V2协议放出,而SUN JDK则采用JRL放出。两者协议虽然都是开放源代码的,但是在使用上的不同在于GPL V2允许在商业上使用,而JRL只允许个人研究使用。
2.OpenJDK不包含Deployment(部署)功能:部署的功能包括:Browser Plugin、Java Web Start、以及Java控制面板,这些功能在OpenJDK中是找不到的。
3.OpenJDK源代码不完整:这个很容易想到,在采用GPL协议的OpenJDK中,SUN JDK的一部分源代码因为产权的问题无法开放给OpenJDK使用,其中最主要的部份就是JMX中的可选元件SNMP部份的代码。
4.部分源代码用开源代码替换:由于产权的问题,很多产权不是SUN的源代码被替换成一些功能相同的开源代码,比如说字体栅格化引擎,使用Free Type代替。
从技术上讲,Oracle JDK 和 OpenJDK 之间的主要区别是啥? [复制]
【中文标题】从技术上讲,Oracle JDK 和 OpenJDK 之间的主要区别是啥? [复制]【英文标题】:Technically what is the main difference between Oracle JDK and OpenJDK? [duplicate]从技术上讲,Oracle JDK 和 OpenJDK 之间的主要区别是什么? [复制] 【发布时间】:2013-06-25 22:47:44 【问题描述】:我已经使用 OpenJDK 很长时间了,最初是用于没有问题的小型项目。但是自从我开始用它来玩大玩具后,我开始注意到随机/未知的致命错误和崩溃(使用 H.264 编解码器等),在此之前获得系统崩溃+致命错误是一场噩梦由 OpenJDK 引起的。
在对 OpenJDK 彻底失望和厌倦之后,我最终决定切换到 Oracle JDK 7。从那时起,我的致命错误/崩溃就消失了。我仍在跟踪以查看它是否发生,但我还没有遇到那些系统崩溃。
现在我想知道,如果 OpenJDK 只是一个许可证问题,为什么它不可能稳定?
为什么 OpenJDK 在其稳定版本中保留错误,但声称它是 Oracle JDK 的克隆(实际上并非如此),那么在技术上真正将 OpenJDK 与 Oracle JDK 区分开来的是什么? (只有快速的功能可用性?还是专注于稳定性/可靠性?)
【问题讨论】:
@Ved 不是同一个问题,在你评论的那个问题上,问题是是否应该使用 JDK,这里的问题是关于技术差异 这不是同一个问题 找到更好的答案:***.com/a/59041992/248847 【参考方案1】:技术差异是各自目标的结果(OpenJDK 旨在作为参考实现,对社区开放,而 Oracle 旨在成为商业实现)
它们都具有“几乎”相同的 Java API 类代码;但是虚拟机本身的代码其实是不一样的,在库方面,OpenJDK倾向于使用开放的库,而Oracle倾向于使用封闭的库;例如,the font library。
【讨论】:
这在 Java 7 中并不完全正确,当时 Oracle 用开源等效项替换了许多闭源部分。虚拟机的代码实际上几乎完全相同,但是有几个库(例如字体库)是关闭的。 哇,好混乱。那么在Java 7之后,当你用OpenJDK-JRE打包一个应用程序时,它与Oracle ServerJDK-JRE打包它是相同吗?【参考方案2】:OpenJDK 是一个参考模型并且是开源的,而 Oracle JDK 是 OpenJDK 的一个实现并且不是开源的。 Oracle JDK 比 OpenJDK 更稳定。
OpenJDK 在 GPL v2 许可下发布,而 Oracle JDK 在 Oracle 二进制代码许可协议下获得许可。
OpenJDK 和 Oracle JDK 的代码几乎相同,但 Oracle JDK 的类更多,并且修复了一些错误。
因此,如果您想开发企业/商业软件,我建议您使用 Oracle JDK,因为它经过全面测试且稳定。
我在使用 OpenJDK 时遇到了很多应用程序崩溃问题,只需切换到 Oracle JDK 就可以解决这些问题
【讨论】:
Oracle JDK 是封闭源代码并不完全正确。 Oracle JDK 的每个副本都附带 src.zip,其中包含 jdk 中的许多源文件。 关于“使用 OpenJDK 应用程序崩溃的很多问题”,请列出它们? Cheeso,这里是列表bugs.openjdk.java.net/issues/… 我最近遇到了使用 URLConnection 通过 HTTP 轮询数据源的代码问题。在 Oracle JDK 7 和 8 上运行良好,但在 OpenJDK 7 和 8 中会间歇性丢失 cookie 头。我真的希望像 HttpUrlConnection 这样的东西现在在两者之间是统一的......最后切换到 Apache HttpClient 让我不必安装 Oracle JDK。另一个例子:OpenJDK 8 不支持 TLS_ECDHE 密码套件,尽管它支持 TLS_DHE。这很糟糕,但我会牺牲一些 CPU 来让我的 EC2 部署更简单 @rajeshnair,这是 OpenJDK 未解决的 bug 列表,并不意味着在 Oracle JDK 中“已修复”!以上是关于openjdk和oraclejdk有啥区别吗的主要内容,如果未能解决你的问题,请参考以下文章
OracleJDK 和 OpenJDK 有什么区别?来看看大神的回答!
OracleJDK 和 OpenJDK 有什么区别?来看看大神的回答!
知乎高赞:从源码层,拆解OracleJDK和OpenJDK有什么区别?网友:不愧是大神的回答~
知乎高赞:从源码层,拆解OracleJDK和OpenJDK有什么区别?网友:不愧是大神的回答~...