分析JDK、JRE、JVM、JIT 四者的关系与在代码运行时扮演的角色

简介: 分析JDK、JRE、JVM、JIT 四者的关系与在代码运行时扮演的角色

[1] 四者的简要介绍


  · JDK (Java Development Kit)是针对Java开发人员的产品,它包括了Java运行环境JRE、Java工具和Java基础类库;

  · JRE (Java Runtime Environment)是运行Java程序所必须的环境的集合,它包含JVM及Java核心类库。

  · JVM (Java Virtual Machine)Java实现跨平台的最核心的部分,能够运行以Java语言编写的软件程序。

  · JIT (Just In Time)称为即时编译器,是JVM中调用方法时使用。JIT将被调用方法的字节码编译成本机代码,当一个方法在本机代码中编译时,JVM直接调用该方法的编译代码,而不是解释它。

  四者关系如图:

image.png

[2] 详细介绍


  JDK (Java Development Kit)是Java语言的软件开发工具包(SDK)。s是针对Java开发人员的产品,是Java的开发工具。JDK是整个Java的核心,包括了Java的开发环境和运行环境。它由一个处于操作系统层之上的运行环境还有编译,调试和运行用Java语言写的applet和应用程序所需的工具组成。

  安装好JDK后,其目录截图如下:

image.png

  1、bin目录

  是binary(字节码)的缩写,里面存放了JDK的各种工具命令即JDK开发工具的可执行文件(文件都是二进制的,其中包括编译器、解释器以及其他一些工具)该目录应当保存到PATH变量中。

 作为JDK实用程序,文件中主要程序有以下几个:


 Java:Java解释器,直接从类文件执行Java应用程序字节代码。

 Javac:Java编译器,将Java源代码转换成字节码。

 appletviewer:小程序浏览器,一种执行HTML文件上的Java小程序的Java浏览器。

 Javadoc:根据Java源码及说明语句生成HTML文档。

 Jdb:Java调试器,可以逐行执行程序,设置断点和检查变量。

 Javah:产生可以调用Java过程的C过程,或建立能被Java程序调用的C过程的头文件。

 Javap:Java反汇编器,显示编译类文件中的可访问功能和数据,同时显示字节代码含义。

  2、include目录

  由于JDK是通过C和C++实现的,因此在启动时需要引入一些C语言的头文件,所以include目录里面是一些供C语言使用的标题文件,其中C语言的头文件支持Java本地接口和Java虚拟机调试程序接口的本地编程技术。

  3、jre目录

  jre(Java runtime environment即Java运行时环境)目录路径下安装的就是运行Java程序所必须的JRE环境。

 打开jre文件下的lib目录,人们有可能疑惑为什么此目录下也有个java.exe程序,其实这个程序跟jdk的bin目录下的java.exe程序没有什么不同,都是运行java环境的。作为一名开发者,肯定是要运行环境的,因此sun公司(已被Oracle收购)在设计之初,就在安装JDK时会自动带上JRE。

 那为什么带两个运行环境呢,尽管这两个JRE文件夹的内容基本相同,但区别主要体现在工作的职责上,也就是不同的JRE负责不同的工作范围。简单来说就是运行JDK中自己的java代码就用JDK中的java.exe,运行其他自定义的程序就用JRE下的java.exe。

  4、lib目录

  lib是libarary(类库)的缩写。存放的是开发工具使用的归档包文件。例如jar包等,

  dt.jar是所谓DesignTime的东西,是给JavaBean和IDE用的;

  jconsole.jar是给jconsole工具用的;

  tools.jar包含了对开发工具的支持功能库。

总的来说JDK是用于java程序的开发,而JRE则是只能运行class而没有编译的功能。 JDK是提供给  jconsole.jar是给jconsole工具用的;

 tools.jar包含了对开发工具的支持功能库。

总的来说JDK是用于java程序的开发,而JRE则是只能运行class而没有编译的功能。 JDK是提供给

[3] 代码在运行时四者扮演的角色


  笼统地说,JDK运行Java文件需要经过2步:编译运行

8d99fefbed004743baa295b00b9bd667.png

 在Java中,JVM可以理解的代码就叫做字节码(即扩展名为.class的文件),它不面向任何特定的处理器,只面向虚拟机。Java语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以,Java程序运行时相对来说还是高效的(不过,和 C++,Rust,Go 等语言还是有⼀定差距的),由于字节码并不针对⼀种特定的机器,因此,Java 程序无须重新编译便可在多种不同操作系统的计算机上运行。

 JVM类加载器首先加载字节码文件,然后通过解释器逐行解释执行,这种方式的执行速度会相对比较慢。而且,有些方法和代码块是经常需要被调用的(也就是所谓的热点代码),所以后面引进了JIT (just-in-time compilation)编译器,而JIT属于运行时编译。

  当JIT编译器完成第一次编译后,其会将字节码对应的机器码保存下来,下次可以直接使用。而我们知道,机器码的运行效率肯定是高于Java解释器的。

 可以将高级编程语言按照程序的执行方式分为两种:

 · 编译型︰编译型语言会通过编译器将源代码一次性翻译成可被该平台执行的机器码。一般情况下,编译语言的执行速度比较快,开发效率比较低。常见的编译性语言有C、C++、Go、Rust等等。

 · 解释型︰解释型语言会通过解释器一句一句的将代码解释(interpret)为机器代码后再执行。解释型语言开发效率比较快,执行速度比较慢。常见的解释性语言有Python、JavaScript、PHP等等。

  Java语言“编译与解释并存”

相关文章
|
4月前
|
Java
安装JDK18没有JRE环境的解决办法
安装JDK18没有JRE环境的解决办法
400 3
|
1月前
|
Java
JVM运行时数据区
1)虚拟机栈:每次调用方法都会在虚拟机栈中产生一个栈帧,每个栈帧中都有方法的参数、局部变量、方法出口等信息,方法执行完毕后释放栈帧 (2)本地方法栈:为native修饰的本地方法提供的空间,在HotSpot中与虚拟机合二为一
26 2
|
2月前
|
Java
JVM运行时数据区(内存结构)
1)虚拟机栈:每次调用方法都会在虚拟机栈中产生一个栈帧,每个栈帧中都有方法的参数、局部变量、方法出口等信息,方法执行完毕后释放栈帧 (2)本地方法栈:为native修饰的本地方法提供的空间,在HotSpot中与虚拟机合二为一 (3)程序计数器:保存指令执行的地址,方便线程切回后能继续执行代码
25 3
|
2月前
|
小程序 Java 程序员
JDK 和 JRE 有什么区别
JDK(Java Development Kit)是Java开发工具包,包含编译器、调试器等开发工具,用于开发Java程序。JRE(Java Runtime Environment)是Java运行环境,包含Java虚拟机和类库,用于运行Java程序。简言之,JDK用于编写Java程序,JRE用于运行这些程序。
66 1
|
3月前
|
Java
jvm复习,深入理解java虚拟机一:运行时数据区域
这篇文章深入探讨了Java虚拟机的运行时数据区域,包括程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区、元空间和运行时常量池,并讨论了它们的作用、特点以及与垃圾回收的关系。
75 19
jvm复习,深入理解java虚拟机一:运行时数据区域
|
3月前
|
存储 SQL 小程序
JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
这篇文章详细介绍了Java虚拟机(JVM)的运行时数据区域和JVM指令集,包括程序计数器、虚拟机栈、本地方法栈、直接内存、方法区和堆,以及栈帧的组成部分和执行流程。
46 2
JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
|
5月前
|
存储 Java 程序员
JVM自动内存管理之运行时内存区
这篇文章详细解释了JVM运行时数据区的各个组成部分及其作用,有助于理解Java程序运行时的内存布局和管理机制。
JVM自动内存管理之运行时内存区
|
5月前
|
存储 算法 Java
JVM组成结构详解:类加载、运行时数据区、执行引擎与垃圾收集器的协同工作
【8月更文挑战第25天】Java虚拟机(JVM)是Java平台的核心,它使Java程序能在任何支持JVM的平台上运行。JVM包含复杂的结构,如类加载子系统、运行时数据区、执行引擎、本地库接口和垃圾收集器。例如,当运行含有第三方库的程序时,类加载子系统会加载必要的.class文件;运行时数据区管理程序数据,如对象实例存储在堆中;执行引擎执行字节码;本地库接口允许Java调用本地应用程序;垃圾收集器则负责清理不再使用的对象,防止内存泄漏。这些组件协同工作,确保了Java程序的高效运行。
37 3
|
5月前
|
Java
No compiler detected, make sure you are running on top of a JDK instead of a JRE
No compiler detected, make sure you are running on top of a JDK instead of a JRE
68 1
|
5月前
|
Java 编译器 测试技术
Java零基础教学(03):如何正确区别JDK、JRE和JVM??
【8月更文挑战第3天】Java零基础教学篇,手把手实践教学!
76 2