Oraclejdk与Openjdk

参考
OpenJDK和JDK区别
OpenJDK和Sun/OracleJDK 区别 与联系
OpenJDK和SunJDK有啥区别?

一、区别与联系

  • Openjdk是jdk的开源版本
  • 授权与协议不同
  • Openjdk的源代码不完整
  • OpenJDK只包含最精简的JDK

二、查看本地安装的是Openjdk还是Oraclejdk

在命令行输入java -version
1.如果是Openjdk

[machao@dev ~]$ java -version
openjdk version “1.8.0_144”
OpenJDK Runtime Environment (build 1.8.0_144-b01)
OpenJDK 64-Bit Server VM (build 25.144-b01, mixed mode)

2.如果是Oraclejdk

C:\Users\sx-9507>java -version
java version “1.8.0_172”
Java™ SE Runtime Environment (build 1.8.0_172-b11)
Java HotSpot™ 64-Bit Server VM (build 25.172-b11, mixed mode)

注:Java HotSpot™ 64-Bit是说用的是64位的hotspot虚拟机
Server是说虚拟机运行在server模式下。虚拟机有server和client两种模式。

三、简单介绍
OpenJDK原是SunMicrosystems公司为Java平台构建的Java开发环境(JDK)的开源版本,完全自由,开放源码。
Sun Microsystems公司在2006年的JavaOne大会上称将对Java开放源代码,于2009年4月15日正式发布OpenJDK。甲骨文在 2010 年收购SunMicrosystem之后接管了这个项目。
Oracle/Sun JDK里面包含的JVM是HotSpotVM,HotSpot VM只有非常非常少量的功能没有在OpenJDK里,那部分在Oracle内部的代码库里。这些私有部分都不涉及JVM的核心功能。所以说,Oracle/Sun JDK与OpenJDK其实使用的是同一个代码库。

Oracle JDK只发布二进制安装包,而OpenJDK只发布源码

1.Dalvik与java虚拟机
(1)java虚拟机基于栈。基于栈的机器必须使用指令来载入和操作栈上数据,所需指令更多
dalvik虚拟机是基于寄存器的
java虚拟机运行的是java字节码
(java类会被编译成一个或多个字节码.class文件,打包到.jar文件中,java虚拟机从相应的.class文件和.jar文件中获取相应的字节码)
(2)Dalvik和Java之间的另外一大区别就是运行环境——Dalvik经过优化,允许在有限的内存中同时运行多个虚拟机的实例。

2.HotSpot
HotSpot是较新的java虚拟机,用来代替JIT(Just in Time),可以大大提高java运行的性能。
java原先是把源代码编译为字节码在虚拟机执行,这样执行速度较慢。而HotSpot将常用的部分代码编译为本地(原生,native)代码,这样显著提高了性能。

HotSpot包括一个解释器和两个编译器(client和server,二选一),解释与编译混合执行模式,默认启动解释执行。

  • 编译器:java源代码被编译器编译成class文件(字节码),java字节码在运行时可以被动态编译(JIT)成本低代码(前提是解释与编译混合执行模式且虚拟机不是刚启动时)。
  • 解释器:解释器是用来解释class文件(字节码),
  • server启动慢,占内存多,执行效率高,适用于服务端应用
  • client启动快,占用内存小,执行效率没有server快,默认情况下不进行动态编译,适用于桌面应用程序。
    由-XX:+RewriteFrequentPairs参数控制 client模式默认关闭,server模式默认开启
    在jre安装目录下的lib/i386/jvm.cfg 文件下。

3.动态编译
compile during run-time,Dynamic compilation;Just In Time也是这个意思
HotSpot对bytecode的编译不是在程序运行前编译的,而是在程序运行过程中编译的。
HotSpot里运行着一个监视器(Profile Montior),用来监视程序的运行状况。

java字节码(class文件)是以解释的方式被加载到虚拟机中(默认启动时解释执行)。程序运行过程中,那一部分运用频率大,对程序的性能影响重要,对程序运行效率影响大的代码,成为热点(hotspot),Hotspot会把这些热点动态的编译成机器码,HotSpot会把这些热点动态的编译成机器码(native code),同时对机器码进行优化,从而提高运行效率。对那些较少运行的代码,HotSpot就不会吧他们编译。

HotSpot对字节码有三层处理:
不编译:字节码加载到虚拟机中时的状态。也就是当虚拟机执行的时候再编译
编译:吧字节码编译成本地代码。虚拟机执行的时候已经编译好了,不要再编译了
编译并优化:不但吧字节码编译成本地代码,而且还进行了优化

至于哪些程序不编译,哪些编译,哪些优化,则是由监视器(Profile Montior)决定

你可能感兴趣的:(JAVA)