分析JDKJREJVMJIT 四者的关系与在代码运行时扮演的角色

Posted 征途黯然.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分析JDKJREJVMJIT 四者的关系与在代码运行时扮演的角色相关的知识,希望对你有一定的参考价值。

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

  四者关系如图:

[2] 详细介绍

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

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

  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步:编译运行

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

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

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

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

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

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

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

以上是关于分析JDKJREJVMJIT 四者的关系与在代码运行时扮演的角色的主要内容,如果未能解决你的问题,请参考以下文章

分析JDKJREJVMJIT 四者的关系与在代码运行时扮演的角色

++*p,(*p)++,*p++与*++p四者的区别

|& || &&四者的区别

Raid0Raid0+1Raid1Raid5四者的区别

EventBus 事件总线 简介 案例

Android线程管理——线程通信