分析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语言“编译与解释并存”

相关文章
|
3天前
|
存储 缓存 算法
深入浅出JVM(二)之运行时数据区和内存溢出异常
深入浅出JVM(二)之运行时数据区和内存溢出异常
|
3天前
|
算法 Java
深入浅出JVM(十六)之三色标记法与并发可达性分析
深入浅出JVM(十六)之三色标记法与并发可达性分析
|
4天前
|
存储 缓存 Java
JVM 运行时内存篇
JVM 运行时内存篇
7 0
|
5天前
|
存储 Arthas 监控
JVM工作原理与实战(三十):堆内存状况的对比分析
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了堆内存状况的对比分析、产生内存溢出的原因等内容。
12 0
|
5天前
|
Java 编译器 对象存储
java一分钟之Java入门:认识JDK与JVM
【5月更文挑战第7天】本文介绍了Java编程的基础——JDK和JVM。JDK是包含编译器、运行时环境、类库等的开发工具包,而JVM是Java平台的核心,负责执行字节码并实现跨平台运行。常见问题包括版本不匹配、环境变量配置错误、内存溢出和线程死锁。解决办法包括选择合适JDK版本、正确配置环境变量、调整JVM内存参数和避免线程死锁。通过代码示例展示了JVM内存管理和基本Java程序结构,帮助初学者更好地理解JDK和JVM在Java编程中的作用。
18 0
|
5天前
|
监控 算法 安全
JVM工作原理与实战(二十三):堆的垃圾回收-引用计数法和可达性分析法
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了判断堆上的对象是否可以回收的方法(引用计数法、可达性分析法)、查看垃圾回收日志等内容。
12 0
|
5天前
|
存储 监控 安全
JVM工作原理与实战(十九):运行时数据区-方法区
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了方法区、方法区在Java虚拟机的实现、类的元信息、运行时常量池、字符串常量池、静态变量的存储等内容。
11 0
|
5天前
|
存储 Arthas 监控
JVM工作原理与实战(十八):运行时数据区-堆
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了运行时数据区、堆介绍、堆的关键参数等内容。
10 0
|
5天前
|
存储 监控 Java
JVM工作原理与实战(十七):运行时数据区-栈内存溢出
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了栈内存溢出、设置虚拟机栈的大小等内容。
11 0
|
5天前
|
存储 监控 安全
JVM工作原理与实战(十六):运行时数据区-Java虚拟机栈
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了运行时数据区、Java虚拟机栈等内容。
11 0