【Java基础】JDK、JRE、JVM之间的关系

目录

1.编译器、调试器

2.JDK1.8安装目录介绍

3.JDK、JRE、JVM的区别

3.1 Java为什么能跨平台,实现一次编写,多处运行?


1.编译器、调试器

JAVA编译器(javac.exe)

  1. JAVA编译器的作用是将(.java文件)编译成字节码文件,是最基本的开发工具。编译时首先读入java源程序(即在DOS命令行下输入javac HelloWorld.java等文件名参数和其他选项参数),然后进行语法检查,如果出现问题就终止编译。语法检查通过后,生成字节码文件,字节码文件名和原文件名相同,扩展名为.class。

编译器的工作原理

  1. 字节码文件是一种和任何具体机器环境及操作系统环境无关的中间代码,它是一种二进制文件,是Java源文件由Java编译器编译后生成的目标代码文件。编程人员和计算机都无法直接读懂字节码文件,它必须由专门的Java编译器来编译执行。
  2. Java编译器负责将字节码文件翻译成具体硬件环境和操作系统平台下的机器代码,以便执行。因此Java程序不能直接运行在现有的操作系统平台上,它必须运行在被成为Java虚拟机的软件平台之上。
  3. Java语言这种“一次编写,到处运行”的方式,有效的解决了目前大多数高级程序设计语言需要针对不同系统来编译产生不同机器代码的问题,即硬件环境和操作平台的异构问题,大大降低了程序开发、维护和管理的开销。

JAVA调试器

  1. java.exe是Java虚拟机
  2. javadoc.exe用来制作java文档
  3. jdb.exe是java的调试器
  4. javaprof.exe是剖析工具
  5. javac.exe编译java成二进制class文件

java 线上问题定位工具
https://blog.csdn.net/weixin_30716725/article/details/95002051
jdk常用调试工具
https://blog.csdn.net/denganming1214/article/details/82692635
JVM常用调试参数和工具
https://blog.csdn.net/opensure/article/details/46715769
jvm调试工具说明
https://blog.csdn.net/yongche_shi/article/details/38270793

2.JDK1.8安装目录介绍

å¨è¿éæå¥å¾çæè¿°

  • bin:最主要的是编译器(javac.exe);
  • include:java和JVM交互用的头文件;
  • lib:常用类库;

  • jre:java运行环境;

JDK包含JRE,而JRE包含JVM,总的来说JDK是用于Java程序的开发,而jre是只能运行.class而没有编译的功能,eclipse、IntelliJ IDEA等其他IDE有自己的编译器而不是用JDK的。

3.JDK、JRE、JVM的区别

JDK

JDK是Java Development Kit(Java开发工具包)的缩写,是 Java 语言的软件开发工具包(SDK)。在JDK的安装目录下有一个jre目录,里面有两个文件夹binlib,在这里可以认为bin目录里的就是jvm,lib目录里则是jvm所需要的类库,而jvm和lib合起来就称为jre。

JRE

JRE是Java Runtime Environment(Java运行环境)的缩写,jre包含了JVM标准实现及Java核心类库。JRE是Java运行环境,并不是开发环境,所以没有包含任何开发工具(如编译器和调试器)。

JVM

JVM是Java Virtual Machine(Java虚拟机)的缩写,java虚拟机是整个java实现跨平台的最核心的部分,所有的java程序首先被编译成.class的类文件,这种类文件可以再虚拟机上执行。也就是说class并不直接与机器的操作系统相对应,而是经过虚拟机间接与操作系统交互,由虚拟机将程序解释给本地系统执行但是只有JVM还不能完成class的执行,因为在解释class的时候JVM需要调用解释所需要的类库lib,而jre包含lib类库。

JDK、JRE、JVM之间的关系看上图就一目了然:

  1. JDK是整个Java的核心,包括了Java运行环境JRE、Java工具和Java基础类库。
  2. JRE是运行Java程序所必须的环境的集合,包含了JVM标准实现及Java核心类库。
  3. JVM是整个Java实现跨平台的最核心的部分,能够运行以Java语言写的程序。

3.1 Java为什么能跨平台,实现一次编写,多处运行?

  1. Java能够跨平台运行的核心在于JVM。不是Java能够跨平台,而是它的jvm能够跨平台。我们知道,不同的操作系统上的API是不同的,那么如果我们想要写一段代码调用系统的声音设备,就需要针对不同系统的API去写不同的代码来完成动作。
  2. 而Java引入了字节码的概念,jvm只能认识字节码,并将它们解释到系统的API调用。针对不同的系统有不同的jvm实现,有Linux版本的jvm实现,有windows版本的jvm实现,但是同一段代码编译后的字节码是一样的。引用上面的例子,在Java API层面,我们调用系统声音设备的代码是唯一的,和系统无关,编译生成的字节码也是唯一的。但是同一段字节码在不同的jvm实现上会映射到不同系统的API调用,从而实现代码的不加修改即可跨平台运行。

发布了17 篇原创文章 · 获赞 19 · 访问量 515

猜你喜欢

转载自blog.csdn.net/qq_42745749/article/details/104462372