首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Oracle JDK和Open JDK以及垃圾收集之间的区别?

Oracle JDK和Open JDK以及垃圾收集之间的区别?

提问于 2017-12-25 10:22:23
回答 2关注 0查看 1.3K

Oracle和Open JDK之间有什么关键的区别?

比如垃圾回收和其他的JVM参数是一样的吗?

GC之间的工作是不同的?

回答 2

akjok54

发布于 2017-12-25 10:28:22

首先要先明确之间,以及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

最爱开车啦

发布于 2017-12-25 10:27:31

penjdk和oracle jdk都只由Oracle创建和维护。

openjdk和oracle jdk是通过了TCK(Java Technology Certification Kit)的相同Java规范的实现。

大多数JDK的供应商都是在openjdk的基础上编写的,通过对[主要替换许可的专有部分/替换只能在特定操作系统上工作的更多高性能项目]组件进行一些调整,而不会破坏TCK兼容性。

许多厂商都实现了Java规范,并通过了TCK。例如IBM J9,Azul Zulu,Azul Zing,Oracle JDK。

几乎每个现有的JDK都来自openjdk。

和开发者交流更多问题细节吧,去 写回答
相关文章
Open JDK 和 Oracle JDK,哪个更优秀?
Open JDK 是 Sun 在 2006 年末把 Java 开源而形成的项目,这里的“开源”是通常意义上的源码开放形式,即源码是可被复用的,例如 IcedTea、UltraViolet 都是从 Open JDK 源码衍生出的发行版。
南风
2020/02/17
1.2K0
Open JDK 和 Oracle JDK,哪个更优秀?
Oracle JDK与Open JDK 对比
OpenJDK项目主要基于Sun捐赠的HotSpot源代码。此外,OpenJDK被选为Java 7的参考实现,由Oracle工程师维护。关于 JVM,JDK,JRE 和 OpenJDK 之间的区别,Oracle博客帖子在2012年有一个更详细的答案:
黑洞代码
2021/01/14
1.2K0
JVM,JRE,JDK之间的区别和联系
Java Api是Java的应用程序接口,里面有很多写好的Java Class,包含一些重要的语法结构以及基本图形,网络和文件IO,我们可以直接调用。
开源日记
2020/11/25
3.8K0
JVM,JRE,JDK之间的区别和联系
Java Api是Java的应用程序接口,里面有很多写好的Java Class,包含一些重要的语法结构以及基本图形,网络和文件IO,我们可以直接调用。
入门笔记
2022/06/02
9620
JVM,JRE,JDK之间的区别和联系
JDK,JRE,JVM之间的区别
JDK,JRE,JVM之间的区别 JDK, JRE和JVM是java编程语言的核心概念。他们看起来有点相似。作为一个编程者我们似乎也并不是很关心这个概念。但是她们确实是有区别的,并且他们分别基于不同的目的的。本文将会分别解释这三个概念,并且说明他们之间的不同点。 Java Development Kit (JDK) JDK是java环境的核心组件,它提供了编译、调试、执行一个java program必须要用到的可执行和二进制的所有tool。JDK是一个平台定制软件,这也是我们为什么要把安装版分为 fo
ImportSource
2018/04/03
1.4K0
Oracle JDK 和 OpenJDK 有什么区别?
OpenJDK是Sun在2006年末把Java开源而形成的项目,这里的“开源”是通常意义上的源码开放形式,即源码是可被复用的,例如IcedTea、UltraViolet都是从OpenJDK源码衍生出的发行版。
Java技术栈
2020/02/21
1.1K0
Java基础--JDK的安装和配置弄懂 JRE、JDK、JVM 之间的区别与联系
  Java是一门面向对象的编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论允许程序员以优雅的思维方式(思想很重要)进行复杂的编程。Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、动态性特点。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等。
mukekeheart
2019/09/29
1.8K0
Java基础--JDK的安装和配置弄懂 JRE、JDK、JVM 之间的区别与联系
HashMap在JDK1.7以及JDK1.8的区别?
底层是以数组+单链表的形式进行存储的! 1.1.实例化:在底层直接创建Entry[]一维空数组,在第一次put元素时进行初始化和计算容量,数组长度为大于等于给定Size的最小2的次幂。 1.2.插入键值对: 当调用put(key,value)时,经历以下步骤: ①计算key的哈希值(详见我的之前一篇写HashMap底层哈希值计算的文章),然后将哈希值与数组长度-1进行按位与运算,得到应该存储的数组下标索引。 ②如果该数组位置没有Entry,则直接添加即可。 ③若该数组位置已经有Entry了,则计算key与该位置上的其他key的hash值,如果hash值都不相同,则采用头插法添加(key,value)到该数组位置。若与某个Entry中的key的hash值相同,则进一步通过equals方法进行比较,若equals相同则覆盖,若不同则采用头插法添加(key,value)到该数组位置。 1.3.扩容方式 先进行条件判断,key是否为空等等。然后准备进行Entry添加。 当数组的长度大于等于threshold且要插入的地方不为null空值时,进行扩容为原来的2倍。 扩容后需要重新计算要插入元素的hash值,并且计算在新数组长度下的索引。 1.4.Hash算法: 1.7版本会进行判断,当要插入的键值为字符串时,选用其他的hash值计算方法。并且hash值计算完之后采用复杂的避免hash碰撞的运算。hash值没有用final修饰,在进行扩容后可以重新计算。
玖柒的小窝
2021/12/11
5980
JDK和JRE的区别
JRE(Java Runtime Enviroment)是Java的运行环境。面向Java程序的使用者,而不是开发者。如果你仅下载并安装了JRE,那么你的系统只能运行Java程序。JRE是运行Java程序所必须环境的集合,包含JVM标准实现及 Java核心类库。它包括Java虚拟机、Java平台核心类和支持文件。它不包含开发工具(编译器、调试器等)。 JDK(Java Development Kit)又称J2SDK(Java2 Software Development Kit),是Java开发工具包,它提供
10JQKA
2018/05/09
1.2K0
Jre和Jdk的区别?
Jre和Jdk的区别 JRE:(Java Runtime Environment),java运行环境。包括Java虚拟机(JVM Java Virtual Machine)和Java程序所需的核心类库等,如果想要运行一个开发好的Java程序,计算机中只需要安装JRE即可。 JDK:(Java Development Kit Java)开发工具包。JDK是提供给Java开发人员使用的,其中包含了java的开发工具,也包括了JRE。所以安装了JDK,就不用在单独安装JRE了。 其中的开发工具:编译工具(java
Java学习
2018/04/18
1.1K0
OpenJDK和Oracle JDK有什么区别和联系?
《Linux 7安装Oracle 11g打怪经历》的安装过程中,启动图形界面,需要指定jre路径,当时使用yum install jdk安装的,并不能解决问题,查看版本才知道他是OpenJDK,最终使用Oracle JDK,才解决的问题,那OpenJDK和Oracle JDK究竟有什么区别?
bisal
2020/03/13
13.7K1
JDK1~JDK13十种垃圾收集器的吐血总结
HotSpot虚拟机提供了多种垃圾收集器,每种收集器都有各自的特点,没有最好的垃圾收集器,只有最适合的垃圾收集器.我们可以根据自己实际的应用需求选择最适合的垃圾收集器.
JavaEdge
2020/05/27
2.5K0
JDK1~JDK13十种垃圾收集器的吐血总结
弄懂 JRE、JDK、JVM 之间的区别与联系
其实很多 Java 程序员在写了很多代码后,你问他 jre 和 jdk 之间有什么关系,jvm 又是什么东西,很多人不知所云。本篇不会讲述 jvm 底层是如何与不同的系统进行交互的,而主要理清楚三者之间的区别,搞清楚我们写的 xxx.java 文件是被谁编译,又被谁执行,为什么能够跨平台运行。
Single
2018/03/14
1.4K0
弄懂 JRE、JDK、JVM 之间的区别与联系
深入理解JVM垃圾收集机制(JDK1.8)
垃圾收集算法 标记-清除算法 最基础的收集算法是“标记-清除”(Mark-Sweep)算法,分两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。 不足:一个是效率问题,标记和清除两个过程的效率都不高;另一个是空间问题,标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能导致以后在程序运行过程需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一个的垃圾收集动作。 复制算法 为了解决效率问题,一种称为复制(Copying)的收集算法出现了,它将可用内存按容量划分为大
Ryan-Miao
2018/03/21
4.8K0
深入理解JVM垃圾收集机制(JDK1.8)
openJdk和sun jdk的区别
使用过LINUX的人都应该知道,在大多数LINUX发行版本里,内置或者通过软件源安装JDK的话,都是安装的OpenJDK,
斯文的程序
2019/11/07
7800
HashMap 在 JDK1.7 和 JDK1.8 的区别
在平常我们用HashMap的时候,HashMap里面存储的key是具有良好的hash算法的key(比如String、Integer等包装类),冲突几率自然微乎其微,此时链表几乎不会转化为红黑树,但是当key为我们自定义的对象时,我们可能采用了不好的hash算法,使HashMap中key的冲突率极高,但是这时 HashMap为了保证高速的查找效率,就引入了红黑树来优化查询了。
Li_XiaoJin
2022/06/10
1K0
HashMap 在 JDK1.7 和 JDK1.8 的区别
jdk1.8 特性_jdk1.7和1.8的区别
Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。
全栈程序员站长
2022/09/22
8290
jdk1.8 特性_jdk1.7和1.8的区别
全网最全JDK1~JDK15十一种JVM垃圾收集器的原理总结
HotSpot虚拟机提供了多种垃圾收集器,每种收集器都有各自的特点,没有最好的垃圾收集器,只有最适合的垃圾收集器.我们可以根据自己实际的应用需求选择最适合的垃圾收集器.
JavaEdge
2021/02/22
7900
全网最全JDK1~JDK15十一种JVM垃圾收集器的原理总结
不同JDK版本之间 intern 方法有啥区别?
没看出啥区别 是我太菜吗?》 就是 Java堆加进来了,原来是字符串存在 字符串常量池,现在是放在 Java堆 常量池存引用 。 堆中不存在,在常量池中创建、
韩旭051
2021/04/14
6130
不同JDK版本之间 intern 方法有啥区别?
Java的垃圾收集机制和作用,以及HotSpot JVM的垃圾收集算法
在Java中,垃圾收集机制(Garbage Collection)是一种自动的管理内存的机制,用于回收不再使用的对象所占的内存空间。
一凡sir
2023/08/13
2810
Java的垃圾收集机制和作用,以及HotSpot JVM的垃圾收集算法

相似问题

JDK和JRE有什么区别?

2459

从技术上讲,Oracle JDK和OpenJDK的主要区别是什么?

27.9K

JDK下载失败?

1452

jdk11的安装?

24.1K

配置jdk环境问题?

1238
相关问答用户
腾讯云TDP | TDP会员擅长3个领域
平安资管 | 架构师擅长4个领域
擅长3个领域
擅长5个领域
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档