沈天真
作者沈天真·2021-02-17 19:04
售前支持·IPS

你真的了解JDK吗?-It's time to adopt OpenJDK

字数 4507阅读 5769评论 0赞 1

Java语言无疑是现在最流行的编程语言之一,而且很可能不是”之一”,就是最流行的编程语言,虽然最新的情况是,Python 正在迎头赶上,也有统计说Python 已经领先Java一点。使用Java语言的开发人员是如此之多,但是大多数开发人员并没有意识到或者深入研究过JDK本身的差别问题。

JDK / JRE / JVM

很多人在初次接触Java时,甚至在使用Java一段时间后,也经常被JDK / JRE /JVM 这3个名词搞的头晕,能准确的说出三者的关系,应该算是Java入门了。

JDK (Java Development Kit)

JDK(Java Development Kit) 是用于开发 Java 应用程序的软件开发工具,包括了 Java 运行时的环境(JRE)、解释器(Java)、编译器(Javac)、Java 归档(jar ——一种软件包文件格式)、文档生成器(Javadoc)等工具。

JRE (Java Runtime Environment)

JRE(Java Runtime Environment) 提供 Java 应用程序执行时所需的环境,由 Java 虚拟机(JVM)、核心类、支持文件组成。

JVM (Java Virtual Machine)

JVM(Java Virtual Machine)(Java 虚拟机)有三层含义,分别是:

ü JVM规范要求

JVM规范可以参考 https://docs.oracle.com/javase/specs/index.html

ü 满足 JVM 规范要求的一种具体实现(一种计算机程序)

ü 一个 JVM 运行实例,在命令提示符下编写 Java 命令以运行 Java 类时,都会创建一个 JVM 实例。

Java 程序运行时 JVM 是 JRE 的一个实例,也就是 runtime interpreter。它执行的是.class文件,它会将字节码翻译为平台可以执行的机器码。

JVM 是 Java 的核心。

三者关系

JDK = JRE + 开发工具

JRE = JVM + 类库

Java程序的开发过程

ü 利用 JDK (调用 Java API)编写出 Java 源代码,存储于 .java 文件中

ü JDK 中的编译器 Javac 将 Java 源代码编译成 Java 字节码,存储于 .class 文件中

ü JRE 加载、验证、执行 Java 字节码

ü JVM 将字节码解析为机器码并映射到 CPU 指令集或 OS 的系统调用。

OpenJDK / Oracle JDK

Oracle JDK由Oracle 公司完全开发,而OpenJDK由Oracle,OpenJDK和Java Community开发。然而,红帽,Azul Systems,IBM,Apple Inc.,SAP AG等顶级公司也积极参与其开发。

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。

Oracle JDK

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

OpenJDK和Oracle JDK的共同点

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

Oracle JDK与OpenJDK里的JVM都是HotSpot VM。从源码层面说,两者基本上是同一个东西。从JDK 7开始,Oracle JDK里的HotSpot VM,在研发的时候其实就是用放在OpenJDK的Mercurial代码库。也就是说跟大家从外部能实时看到的OpenJDK用的是同一个代码库。HotSpot VM只有非常非常少量的功能没有在OpenJDK里,那部分在Oracle内部的代码库里。这些私有部分都不涉及JVM的核心功能。所以当一个Oracle员工要构建OpenJDK时,他要做的事情跟外面的人一样:从http://hg.openjdk.java.net 签出代码,构建。而当他要构建Oracle JDK时,他同样需要先从http://hg.openjdk.java.net 签出OpenJDK,然后从Oracle内部的代码库签出私有的部分,放在OpenJDK代码下的一个特定目录里,然后构建。这些HotSpot VM私有的部分主要是Java Flight Recorder的内部实现,以及还有没有公开到OpenJDK的其它平台的port,例如Oracle自己的ARM、PPC版HotSpot VM。

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

OpenJDK和Oracle JDK 的区别

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

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

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

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

实际使用

命令行中使用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的实现,在这些Linux上安装JDK,默认安装的都是OpenJDK。

开源的JDK/JVM

以下实现是开源的,可以免费使用:

ü AdoptOpenJDK

ü Amazon Corretto

ü Azul Zulu

ü Bck2Brwsr

ü CACAO

ü Codename One

ü DoppioJVM

ü Eclipse OpenJ9

ü GraalVM CE

ü HaikuVM

ü HotSpot

ü Jamiga

ü JamVM

ü Jelatine JVM

ü Jikes RVM (Jikes Research虚拟机)

ü JVM.go

ü leJOS

ü Maxine

ü Multi-OS Engine

ü RopeVM

ü uJVM6.2

专有实现还有受版权保护的JDK/JVM

ü Azul Zing JVM

ü CEE-J

ü Excelsior JET

ü GraalVM EE

ü Imsys AB

ü JamaicaVM (aicas)

ü JBlend (Aplix)

ü MicroJvm (IS2T - 工业智能软件技术)

ü OJVM

ü PTC Perc

ü SAP JVM

ü Waratek CloudVM for Java

看到这里,至少给大家一个印象,Java的世界里不只是Oracle JDK,但是如何选择合适的JDK呢 ? 下图给出了一些建议。

从上图可以看到,在 K1 Power 上可以使用 AdoptOpenJDK。

更多的最新的JDK ,JVM的知识,可以参考下面的链接

JVM ecosystem report 2020

https://snyk.io/blog/jvm-ecosystem-report-2020/

如Oracle 宣布的那样,在没有商业许可的情况下,在2019年1月之后发布的Oracle Java SE 8的公开更新将无法用于商业,商业或生产用途。但是,OpenJDK是完全开源的,可以自由使用。

随着OpenJDK的发展,以及出于商业政策的考虑,越来越多的企业和项目选择采用OpenJDK。

参考链接:

https://www.jianshu.com/p/7b99bd132470

https://www.zhihu.com/question/327162941

https://cloud.tencent.com/developer/article/1598291

https://snyk.io/blog/jvm-ecosystem-report-2020/

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

1

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广