关于JVM、JRE与JDK
1. JVM(Java Virtual Mechinal)
Java虚拟机,是整个java实现跨平台的最核心的部分,负责解释执行字节码文件,是可运行java字节码文件的虚拟计算机。当使用Java编译器编译Java程序时,生成的是与平台无关的字节码,这些字节码只面向JVM。不同平台的JVM都是不同的,但它们都提供了相同的接口。只要为不同平台实现了相应的虚拟机,编译后的Java字节码就可以在该平台上运行。
2. JRE: Java Runtime Environment
java运行时环境,包含了java虚拟机,java基础类库。是使用java语言编写的程序运行所需要的软件环境,普通用户而只需要安装 JRE来运行 Java 程序。
3. JDK:Java Development Kit
java开发工具包,是使用java语言编写java程序所需的开发工具包。JDK包含了JRE,同时还包含了编译java源码的编译器javac,还包含了很多java程序调试和分析的工具:jconsole,jvisualvm等工具软件,还包含了java程序编写所需的文档和demo例子程序。
4 区别与联系
- JDK 用于开发,JRE 用于运行java程序 ;如果只是运行Java程序,可以只安装JRE,无序安装JDK。
- JDk包含JRE,JDK 和 JRE 中都包含 JVM。
- JVM 是 java 编程语言的核心并且具有平台独立性。
关于JDK发行版本
Java由SUN公司(Sun Microsystems, 发起于美国斯坦福大学, SUN是Stanford University Network的缩写)发明, 2006年SUN公司将Java开源, 此时的JDK即为OpenJDK。
就源代码而言,只有一套Java源代码,存在OpenJDK项目中。但只是源代码,不是发布版本。理论上,任何人都可以从源代码构建一个版本然后发布,但是这个发行版缺少认证,不能对外号称与Java SE兼容。
所以一些企业、社区等供应商会自己构建、进行认证,然后发布,特别关注,Linux操作系统发行商一般都会提供内置JDK发行版本(软件源支持,并没有直接默认安装)。
常见JDK发行版本包括OracleJDK,OracleOpenJDK,AdoptOpenJDK,RedHatOpenJDK,Alibaba Dragonwell,Azul Zulu,Amazon Corretto等,供应商可以添加商标或者他们认为有用的其他实用程序。
根据普遍使用场景,本文介绍OracleJDK,OracleOpenJDK,AdoptOpenJDK,其他版本请自行了解。
1. OracleOpenJDK
OpenJDK是Java SE的开源实现, 它由SUN和Java社区提供支持, 2009年Oracle收购了Sun公司, 自此Java的维护方之一的SUN也变成了Oracle。
- OpenJDK采用GPL V2协议放出,允许商用。
- OpenJDK不能使用Java商标,在Sun被Oracle收购以后,Java这个商标就归Oracle所有了,OpenJDK执行“java -version”时显示OpenJDK,不会显示Java。
- OpenJDK不包含Deployment(部署)功能:部署的功能包括:Browser Plugin、Java Web Start、以及Java控制面板。
- OpenJDK源代码不完整,在采用GPL协议的OpenJDK中,sun jdk的一部分源代码因为产权的问题无法开放OpenJDK使用,其中最主要的部份就是JMX中的可选元件SNMP部份的代码,该部分功能可以通过插件形式补充。
- OracleOpenJDK由Oracle定期发布,但新版本发布后,不再维护旧版本。
2. OracleJDK
Oracle收购SUN以后,构建并发布OracleJDK,即大家普遍熟悉的JDK,也是生产环境使用最多的JDK发行版本,拥有Java完整功能,以及OpenJDK没有的一些商用特性,同时,Oracle定期发布OracleJDK,但也会产期维护LTS的旧版本(目前Java SE 7,8,11,17,21为LTS版本),所以功能性、稳定性、安全性要高于OpenJDK。不过,作为OpenJDK社区的主导者,Oracle也在尽量减少OpenJDK和Oracle JDK的差别(source),将一些商业特性移植到了OpenJDK上,比如Java Flight Recorder,Java Mission Control和ZGC等。
对于普通开发者,两者差异可忽略不计。
2019年4月16日以及之前发布的 OracleJDK 授权许可协议是BCL协议,即Oracle Binary Code License Agreement,协议规定我们可以使用JDK,但是不能进行修改。私用和商用都可以。
2019年4月16日,Oracle发布了新的JDK 8的更新,版本号为8u211和8u212。与以往不同的是,新版本的许可协议从BCL换成了OTN,即Oracle Technology Network License Agreement,目前新发布的JDK用的都是这个协议,可以私用以及研发用,商用需要付费,这就意味着,我们不能在生产环境使用这个版本了。所以,OracleJDK最后的免费版本为2019年1月15日发布的Oracle JDK 8u201和8u202。
特别关注:关于OracleJDK每次发布2个版本号,请参照附录
下图表示两种许可协议的区别
下图表示各个版本对应的许可协议
特别关注:OracleJDK与JRE
OracleJDK 8及以前版本,安装后在JDK目录下会提供一个JRE目录,功能同单独JRE,但从OracleJDK 9开始不再包含JRE目录。
OracleJDK 10及以前版本,都提供独立的JRE安装包下载,但OracleJDK 11及以后版本,不再提供独立的JRE安装包下载,JDK满足开发与运行环境。
3. AdoptOpenJDK
2017年,一群Java用户组(JUG)成员、开发者和供应商(包括亚马逊、微软、Pivotal、Redhat等)建立了一个社区称作AdoptOpenJDK。他们提供免费、稳固的OpenJDK build,可用性与更新周期更长。甚至还有两个不同的Java虚拟机可供选择:HotSpot和OpenJ9,请参考两种虚拟机测试对比,其中,HotSpot为JVM默认类型,OpenJ9为IBM优化版。
AdoptOpenJDK官网提供OpenJDK包自定义构建选择,支持OpenJDK版本选择与JVM类型选择。
2021年7月24日,AdoptOpenJDK开始迁移至Eclipse基金会维护,AdoptOpenJDK的发布也将根据JVM类型分别到相应的平台下载:
特别关注:各操作系统供应商默认集成的OpenJDK为OracleOpenJDK,但根据Oracle后续的授权协议以及各OpenJDK供应商的政策,不排除操作系统默认集成的版本会变更,请开发者关注。
AdoptOpenJDK安装
本文介绍
AdoptOpenJDK安装。
特别关注:CPU架构
获取安装包之前,确认Linux服务器的CPU架构,如果服务器架构与JDK不符,则无法运行
#arm架构
[app@ecs-4bcb-0003 ~]$ arch
aarch64
[app@ecs-4bcb-0003 ~]$ uname -a
Linux ecs-4bcb-0003.novalocal 4.19.90-23.8.v2101.ky10.aarch64 #1 SMP Mon May 17 17:07:38 CST 2021 aarch64 aarch64 aarch64 GNU/Linux
[app@ecs-4bcb-0003 ~]$ cat /proc/version
Linux version 4.19.90-23.8.v2101.ky10.aarch64 (KYLINSOFT@localhost.localdomain) (gcc version 7.3.0 (GCC)) #1 SMP Mon May 17 17:07:38 CST 2021
#x86架构
[app@host-10-169-3-54 ~]$ arch
x86_64
[app@host-10-169-3-54 ~]$ uname -a
Linux host-10-169-3-54 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
[app@host-10-169-3-54 ~]$ cat /proc/version
Linux version 3.10.0-957.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) ) #1 SMP Thu Nov 8 23:39:32 UTC 2018
组件安装操作步骤参考 组件安装部署手册模板,根据不同组件的安装目标,部分操作可以省略。
本文将按照该参考步骤执行。
一、获取组件可执行程序库,包括主程序,此为组件的基本文件
AdoptOpenJDK建议使用二进制文件安装。
创建目录 /usr/local/jdk,将rpm包下载到该目录下
1.1 AdoptOpenJDK - HotSpot JVM
1.2 AdoptOpenJDK - OpenJ9 JVM
2 解压安装
2.1 HotSpot JVM
所有程序文件都保存在解压目录下
[root@localhost jdk]# tar -zxvf OpenJDK8U-jdk_x64_linux_hotspot_8u322b06.tar.gz [root@localhost jdk]# cd jdk8u322-b06/ [root@localhost jdk8u322-b06]# ll 总用量 51732 -r--r--r-- 1 root root 1522 1月 19 20:30 ASSEMBLY_EXCEPTION drwxr-xr-x 2 root root 4096 1月 19 20:30 bin drwxr-xr-x 3 root root 132 1月 19 20:30 include drwxr-xr-x 4 root root 95 1月 19 20:30 jre drwxr-xr-x 3 root root 144 1月 19 20:30 lib -r--r--r-- 1 root root 19274 1月 19 20:30 LICENSE drwxr-xr-x 4 root root 47 1月 19 20:30 man -rw-r--r-- 1 root root 2401 1月 19 20:30 NOTICE -rw-r--r-- 1 root root 454 1月 19 20:30 release drwxr-xr-x 10 root root 151 1月 19 20:30 sample -rw-r--r-- 1 root root 52776682 1月 19 20:30 src.zip -r--r--r-- 1 root root 157063 1月 19 20:30 THIRD_PARTY_README [root@localhost jdk1.8.0_321]#
2.2 OpenJ9 JVM
[root@localhost jdk]# tar -zxvf OpenJDK8U-jdk_x64_linux_openj9_linuxXL_8u282b08_openj9-0.24.0.tar.gz [root@localhost jdk]# cd jdk8u282-b08/ [root@localhost jdk8u282-b08]# ll 总用量 53332 -r--r--r-- 1 root root 1522 1月 20 2021 ASSEMBLY_EXCEPTION drwxr-xr-x 2 root root 4096 1月 20 2021 bin -rw-r--r-- 1 root root 17300 1月 20 2021 epl-2.0.html drwxr-xr-x 3 root root 150 1月 20 2021 include drwxr-xr-x 4 root root 95 1月 20 2021 jre drwxr-xr-x 3 root root 126 1月 20 2021 lib -r--r--r-- 1 root root 19650 1月 20 2021 LICENSE drwxr-xr-x 4 root root 47 1月 20 2021 man -rw-r--r-- 1 root root 33947 1月 20 2021 openj9-notices -rw-r--r-- 1 root root 6384 1月 20 2021 openj9-openjdk-notices -rw-r--r-- 1 root root 380 1月 20 2021 release drwxr-xr-x 10 root root 151 1月 20 2021 sample -rw-r--r-- 1 root root 54357086 1月 20 2021 src.zip -r--r--r-- 1 root root 155003 1月 20 2021 THIRD_PARTY_README
二、安装系统服务
jdk为java程序运行环境,无需独立运行,即无需安装系统服务
三、主程序加入到环境变量
1.rpm安装完成后,自动在环境变量目录 /usr/bin/ 创建java主程序文件
2.二进制安装完成后,需要手动配置环境变量
编辑 /etc/profile 文件,增加如下内容,然后执行 source /etc/profile 使环境变量生效
#java env
export JAVA_HOME=/usr/local/jdk/jdk1.8.0_201
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASSPATH
export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin
export PATH=$PATH:${JAVA_PATH}
四、配置文件
jdk为java程序运行环境,无需独立运行,即没有配置文件
五、运行用户
jdk为java程序运行环境,无需独立运行,即无需运行用户
六、开机启动
jdk为java程序运行环境,无需独立运行,即无需配置开机启动
七、服务启动运行
验证jdk安装效果,使用OracleJDK会显示Java商标
1. HotSpot JVM
[root@localhost jdk8u322-b06]# java -version openjdk version "1.8.0_322" OpenJDK Runtime Environment (Temurin)(build 1.8.0_322-b06) OpenJDK 64-Bit Server VM (Temurin)(build 25.322-b06, mixed mode)
2. OpenJ9 JVM
[root@localhost jdk8u282-b08]# java -version openjdk version "1.8.0_282" OpenJDK Runtime Environment (build 1.8.0_282-b08) Eclipse OpenJ9 VM (build openj9-0.24.0, JRE 1.8.0 Linux amd64-64-Bit 20210120_869 (JIT enabled, AOT enabled) OpenJ9 - 345e1b09e OMR - 741e94ea8 JCL - ab07c6a8fd based on jdk8u282-b08)
附录:AdoptOpenJDK与JRE
AdoptOpenJDK安装后在JDK目录下会提供一个JRE目录,且提供单独JRE下载。