JDK、JRE、JVM及JDK版本特性

本文详细介绍了Java开发环境中的关键组件JDK、JRE和JVM之间的关系与区别。JVM是Java实现跨平台的核心,负责解释执行字节码。JRE包含了JVM和必要的类库,供Java程序运行。JDK则包含了JRE以及开发所需的工具,如Java编译器。此外,文章还讨论了JDK不同版本的特性,如JDK 9的模块化、JDK 8的Lambda表达式和时间日期API,以及JDK 11的本地变量类型推断等。
摘要由CSDN通过智能技术生成

Java程序是运行在JVM(Java虚拟机)上的,在开发程序之前都要配置Java开发环境,其中首先要做的就是JDK的安装和配置,那么JDK、JVM、JRE到底有何联系和区别呢?想必并不是每一个程序员都能说得清楚的,本文接下来将带你了解它们之间的关系。
在这里插入图片描述
一、JVM
JVM(Java Virtual Mechinal),Java虚拟机,是JRE的一部分。它是整个java实现跨平台的最核心的部分,负责解释执行字节码文件,是可运行java字节码文件的虚拟计算机。所有平台的上的JVM向编译器提供相同的接口,而编译器只需要面向虚拟机,生成虚拟机能识别的代码,然后由虚拟机来解释执行。

当使用Java编译器编译Java程序时,生成的是与平台无关的字节码,这些字节码只面向JVM。不同平台的JVM都是不同的,但它们都提供了相同的接口。JVM是Java程序跨平台的关键部分,只要为不同平台实现了相应的虚拟机,编译后的Java字节码就可以在该平台上运行。
Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。这就是Java的能够“一次编译,到处运行”的原因。

二、JRE
JRE( Java Runtime Environment) 、Java运行环境,用于解释执行Java的字节码文件。普通用户而只需要安装 JRE(Java Runtime Environment)来运行 Java 程序。而程序开发者必须安装JDK来编译、调试程序。

下图是JRE的安装目录:里面有两个文件夹bin和lib,在这里可以认为bin里的就是jvm,lib中则是jvm工作所需要的类库,而jvm和 lib和起来就称为jre。
在这里插入图片描述
三、JDK
JDK(Java SE Development Kit),Java标准开发包,它提供了编译、运行Java程序所需的各种工具和资源,包括Java编译器、Java运行时环境,以及常用的Java类库等。总的来说JDK是用于java程序的开发,而jre则是只能运行class而没有编译的功能。

下图是JDK的安装目录:
在这里插入图片描述
四、三者联系和区别
JVM不能单独搞定class的执行,解释class的时候JVM需要调用解释所需要的类库lib。在JDK下面的的jre目录里面有两个文件夹bin和lib,在这里可以认为bin里的就是jvm,lib中则是jvm工作所需要的类库,而jvm和 lib和起来就称为jre。JVM+Lib=JRE。总体来说就是,我们利用JDK(调用JAVA API)开发了属于我们自己的JAVA程序后,通过JDK中的编译程序(javac)将我们的文本java文件编译成JAVA字节码,在JRE上运行这些JAVA字节码,JVM解析这些字节码,映射到CPU指令集或OS的系统调用。

JDK和JRE区别:在bin文件夹下会发现,JDK有javac.exe而JRE里面没有,javac指令是用来将java文件编译成class文件的,这是开发者需要的,而用户(只需要运行的人)是不需要的。JDK还有jar.exe, javadoc.exe等等用于开发的可执行指令文件。这也证实了一个是开发环境,一个是运行环境。
JRE和JVM区别:JVM并不代表就可以执行class了,JVM执行.class还需要JRE下的lib类库的支持,尤其是rt.jar。

五、JDK,JRE版本说明
JDK从9开始,Oracle版本用于商业开始收费了,你应该避免使用oracle jdk而应该使用open jdk,去openjdk.java.net上下载,而不是java.com上下载,因为oracle jdk顾名思义,是oracle的版权产品,open jdk免费开源的真jdk。
JDK从9开始,已经模块化了,模块化之后,就不再区分jvm,jre和jdk了,过去jvm是jre的子集,jre对比jvm多了rt.jar标准包的内容。而jre是jdk的子集,jdk对比jre多了javac等工具。那么9的jigsaw之后,所有这些,都被拆成了一个又一个jmod模块,比如java.base.jmod,jdk.javac.jmod等。那用户可以根据自身需要,自由组合出自己的runtime,而这个runtime可能是jdk,也可能是jre+jdk的一部分,也可能是jre的一部分+jdk的一部分,或者干脆就只有jvm的一部分。而且用户可以添加第三方提供的native扩展,比如常见的两个扩展是javafx(gui)和graal(多语言)扩展,graal 19.3多语言扩展将会在2019的11月19日发布,到时候你可以利用该工具扩展出支持javascript,python,ruby,r等语言的运行时(runtime),甚至java提供了jaotc可以将整个runtime精简,做成binary二进制机器码,就跟c等语言一样了。所以这个时候再提供jre就毫无意义了,因为这跟以前你拿一个jar出来,然后所有有jre的地方都能运行不一样了。如果你的jar依赖的jmod不在你自己做的runtime里面,那还是运行不了。所以就不再提供jre了,你需要的话,用jlink自己制作runtime。

JDK从1.5开始,发展到如今14.0(Open JDK GA 2020/03/17),每个版本都有新特性,下面分别列举各处版本的特性。

v1.5 特性(Tiger,于2004-09-30发行)

  1. 泛型(Generic)
    在JDK1.5之前一个集合可以放任何类型的对象,相应地从集合里面拿对象的时候我们也不得不对他们进行强制的类型转换。引入了泛型之后,它允许指定集合里元素的类型,这样在编译阶段就会对对象进行类型检查。
  2. for-each循环(Enhanced for loop)
  3. 自动拆装箱(Autoboxing/unboxing) 自动拆装箱大大方便了基本类型数据和它们包装类的使用
    自动装箱:基本类型自动转为包装类(int >> Integer) 自动拆箱:包装类自动转为基本类型(Integer >> int)
    在JDK1.5之前,我们总是对集合不能存放基本类型而耿耿于怀,现在自动转换机制能解决我们的问题
  4. 类型安全的枚举(Type safe enums)
    JDK1.5加入了一个全新的“类”–枚举类型。为此JDK1.5引入了一个新关键字enum
  5. 可变参数(Var args)
    可变参数使程序员可以声明一个接受可变数目参数的方法。注意,可变参数必须是函数生命中的最后一个参数。
  6. 静态导入(static import)
    要使用静态成员(方法和变量)我们给出提供这个方法的类。使用静态导入可以使被导入类的所有静态变量和静态方法在当前类直接可见,使用这些静态成员无需再给出他们的类名
    import static java.lang.Math.*;
r = sin(PI * 2)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值