首页 > 其他分享 >分析JDK、JRE、JVM、JIT 四者的关系与在代码运行时扮演的角色

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

时间:2023-01-16 18:06:04浏览次数:39  
标签:JRE Java 字节 JDK 编译 JVM 运行


[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直接调用该方法的编译代码,而不是解释它。

  四者关系如图:

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

[2] 详细介绍

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

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

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

  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是提供给Java开发人员使用的,其中包含了Java的开发工具,也包括了JRE。所以安装了JDK,就不用在单独安装JRE了。 其中的开发工具包括编译工具(javac.exe)打包工具(jar.exe)等。

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

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

分析JDK、JRE、JVM、JIT 四者的关系与在代码运行时扮演的角色_开发语言_03

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


标签:JRE,Java,字节,JDK,编译,JVM,运行
From: https://blog.51cto.com/u_15942590/6010661

相关文章

  • linux系统通过yum命令安装jdk
    在linux上查看jdk版本命令:java-version,如下图所示-bash:java:commandnotfound,说明没有安装jdk接下来执行yumsearchjava|grepjdk命令,查询可以安装的jdk版本rpm......
  • centos7 安装jdk11
    升级了jenkins,发现无法启动。手动启动时提示jdk版本过旧,于是升级jdk。因为之前我是使用tar安装,所以我直接删除jdk1.8的全部文件,然后删除配置文件的相关配置,然后重新安......
  • [Java SE] JDK版本特性解读:@PostStruct[JDK1.6-JDK1.8]
    [email protected]概述定义及用途@PostConstruct(javax.annotation.PostConstruct)注解好多人以为是Spring提供的。而实际上是Java自身的注解。Java中该注解的说明:@P......
  • Java入门关于JDK
    Java入门JDKJDK:JavaDevelopmentKitJDK是JavaDevelopmentKit的缩写,是Java的开发工具包。JDK:JavaDevelopmentToolKit(Java开发工具包)。JDK是整个JAVA的核心,包......
  • Linux下JDK和Tomcat安装
    下载地址​​​http://www.oracle.com/technetwork/java/javase/downloads/index.html​​​http://download.oracle.com/otn-pub/java/jdk/8u31-b13/jdk-8u31-linux-......
  • JDK17的下载安装与配置(详细教程)
    1.搜索JDK的官方网址​​​https://www.oracle.com/java/technologies/downloads/#jdk17​​​2.切换到window系统,根据自己电脑的系统进行切换。然后点击下载3.下载完成......
  • Java JDK1.8的安装详细教程
    转载:https://www.jb51.net/article/243119.htmjdk1.8又称jdk8.0,是目前相对比较稳定的版本,不建议下载最新的jdk版本,因为最新版的jdk不稳定,在Java的学习中可能会出现各种各......
  • Dockerfile制作jdk-17
    下载jdk-17#wgethttps://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gzDockerfileFROMubuntu:22.04ENVJAVA_HOME=/usr/local/jdk-17.0.5ENVJRE_HOM......
  • jdk7中HashMap的实现原理和源码解读
    jdk7中HashMap是通过数组+链表实现的。一、hashmap的存储原理Map集合中的数据都是键值对形式的,例如key:"a",value:"1",而数组中的某个位置只能存储一个元素,所以为了把键......
  • jdk8 stream使用
    匹配集合里面某个字段YthgkZdryHbhb=hbList.stream().filter(bo->!bo.getJz().equals(ythgkZdry.getJz())).collect(Collectors.toList()).get(0);将集合里面某个字段......