—-慢慢来比较快,虚心学技术—-
**

JDK?JRE?JVM?

JDK(Java Development ToolKit)

**
Java 开发工具包, 提供编译和运行 java 程序所需的各种工具和资源, 包括 java 编译器, 调试器, JRE, 以及常用 java 类库

其目录结构如下:

bin**: 包含最重要的编译器(javac.exe)

include**: java和JVM交互用的头文件

jre**: 运行时环境

lib**: 常用类库
**
src 类库源码压缩包和几个声明文件

由于java中的工具和编译器等都是由java语言编写的,自然需要在java运行时环境下才可以运行,所以才会需要在jdk中包含一套jre,该jre专门用于jdk工具运行,不负责一般java程序运行

图片.png

JRE(Java Runtime Enviromental)

Java 运行时环境, 也就是我们说的 java 平台, 提供运行基于 java 语言编写的程序所不可或缺的环境, 通过它, 开发者可以将应用程序发布到用户手中, 让用户使用. 也就是说, JRE 不是开发环境, 而是 java 运行环境, 面向对象是用户而不是开发者

JRE中包含了Java Virtual Mechinal(JVM),Runtime Class Libraries和Java Application Launcher

JRE 目录结构如下:

可以认为:**bin就是JVM,里面有运行.class的java.exe文件
lib则是JVM工作所需要的类库**

图片.png

JVM(Java Virtual Mechinal)

Java 虚拟机, 是 JRE 的一部分, 是一个虚构出来的计算机, 它拥有完善的『硬件架构』, 如处理器, 堆栈, 寄存器等, 且具有相应的指令系统.

其主要工作是解析自己的指令集并映射到本地的 CPU 指令集或 OS 的系统调用.

简单来说,**JVM是充当Java程序和本地CPU/OS系统的适配器

Java 程序首先通过 JDK 的编译器 (javac.exe) 将程序编译成 class 文件, 而 class 文件并不直接与操作系统交互, 而是交由 JVM 虚拟机将 class 文件通过指令集解析给操作系统执行, 实际上起作用的是 JRE 目录中的 bin/server/jvm.dll

所以三者关系大致如下图:

图片.png

图片.png

Write Once Run Anywhere?

“**一次编写,到处执行**”是java的跨平台(平台无关)特性口号。

实际上, java 之所以有这么一个特性, 是基于不同平台的不同 jvm 来实现的, 不同操作系统 (平台) 的编码格式不一样, 而 jvm 则相当于平台和 java 程序之间的适配器, 使得一份 java 程序可以基于不同的平台使用不同的 jvm 解析运行, 而不需要更改代码

所以, 实际上 JVM 并不与包括 java 在内的任何语言绑定, 而是和.class 文件这种特定的二进制文件格式绑定, 只要特定编程语言能够将代码编译成 class 二进制文件, JVM 并不会关心是什么语言

图片.png**

如有贻误,还请评论指正 JVM - 图6JVM - 图7