JDK、JRE、JVM

JDK、JRE、JVM三者间的联系与区别

  有Java编程经验的程序员应该都知道:Java程序是运行在JVM(Java虚拟机)上的,在开发程序之前都要配置Java开发环境,其中首先要做的就是JDK的安装和配置,那么JDK、JVM、JRE到底有何联系和区别呢?想必并不是每一个程序员都能说得清楚的,本文接下来将带你了解它们之间的关系。

JDK、JRE、JVM

一、JDK

  JDK(Java SE Development Kit),Java标准开发包,它提供了编译、运行Java程序所需的各种工具和资源,包括Java编译器、Java运行时环境,以及常用的Java类库等。

下图是JDK的安装目录:
JDK、JRE、JVM

二、JRE

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

下图是JRE的安装目录:里面有两个文件夹bin和lib,在这里可以认为bin里的就是jvm,lib中则是jvm工作所需要的类库,而jvm和 lib和起来就称为jre。
JDK、JRE、JVM

三、JVM

JVM(Java Virtual Mechinal),Java虚拟机,是JRE的一部分。它是整个java实现跨平台的最核心的部分,负责解释执行字节码文件,是可运行java字节码文件的虚拟计算机。所有平台的上的JVM向编译器提供相同的接口,而编译器只需要面向虚拟机,生成虚拟机能识别的代码,然后由虚拟机来解释执行。

当使用Java编译器编译Java程序时,生成的是与平台无关的字节码,这些字节码只面向JVM。不同平台的JVM都是不同的,但它们都提供了相同的接口。JVM是Java程序跨平台的关键部分,只要为不同平台实现了相应的虚拟机,编译后的Java字节码就可以在该平台上运行。

四、区别与联系

  • JDK 用于开发,JRE 用于运行java程序 ;如果只是运行Java程序,可以只安装JRE,无序安装JDK。
  • JDk包含JRE,JDK 和 JRE 中都包含 JVM。
  • JVM 是 java 编程语言的核心并且具有平*立性。

五、机器码

JVM语言无关性的基础是编译器–不同语言,通过不同的编译器,都编译为字节码。
JVM平台无关性的基础是JVM–相同字节码,通过不同的JVM,在不同平台上解释执行。

机器码顾名思义就是机器能够读懂的代码,人不太可读的代码。既然机器能读懂,那么不同机器,必然只能读懂它自己的代码。所以,机器码和机器硬件即cpu是强相关性的。比如intel和AMD,相同一段高级编程语言,最终生成的可执行机器码就会不一样。

方法内联:

java JIT编译,会进行方法内联优化。比如方法foo1调用了foo2,foo2调用了foo3,由于foo2执行的频率较高,所以,foo2被内联到foo1里面。那么调用foo1后,就不用在调用foo2了,foo2的实现被写到foo1里面了。方法内联,可以保证完整功能同时,减少方法的调用次数。

方法内联 指的是在即时编译过程中遇到方法调用时,直接编译目标方法的方法体,并替换原方法调用。

注:

  • 方法内联属于即时编译期的优化技术;
  • 即时编译的过程是字节码被解析成LTR图,优化LTR图,再由优化过的IR图生成机器码的过程;字节码 -> 高级中间代码(HIR) -> 低级中间代码(LTR) -> 机器码。如下图。
  • 解析指的是即时编译器对字节码做的动作,是字节码到IR图的转换;
    JDK、JRE、JVM
    [参考博客]
    https://www.cnblogs.com/bingyimeiling/p/10266949.html
    https://www.jianshu.com/p/efb6ead93eb3