> 文章列表 > JDK JRE JVM之间的关系

JDK JRE JVM之间的关系

JDK JRE JVM之间的关系

文章目录

  • 1.从定义的角度解释JDK、JRE、JVM
  • 2、详细介绍JDK
  • 3、详细介绍JRE
  • 4、详细介绍JVM
    • 1、JVM内部区域划分
  • 5、如何运行一个java程序?

本篇文章仅仅是个人片面观点,可能有错误或者表述不清的地方

1.从定义的角度解释JDK、JRE、JVM

JDK:Java Develement Kit (java开发工具包
JRE: Java Runtime Environment (java运行环境
JVM: Java Virtual Machine (java虚拟机)


2、详细介绍JDK

JDK全称Java Develement Kit (Java开发工具包),顾名思义就是开发Java所需的工具的集合,打开jdk的安装路径, 可以看到jdk文件夹里面包含了bin、jre、lib等文件夹(如下图1所示);

1.bin目录下最主要的就是java的编译器javac;
2.include里面是java和JVM交互用的头文件;
3.lib里面主要是java类库;

打开里面的jre文件夹,里面又包含bin、lib文件夹,(如下图2所示)java和lib合起来就是jre;

1.其中bin文件夹里就包含有jvm;
2.lib是java工作时所需要的类库

JDK是整个JAVA的核心,包括了Java运行环境(jre),一堆Java工具(javac/java/jdb等)和Java基础的类库(即Java API);
JDK JRE JVM之间的关系


jdk、jre、jvm的关系可以简略的按下图理解
JDK JRE JVM之间的关系


3、详细介绍JRE

JRE全称Java Runtime Environment (java运行环境),包含JVM和java标准核心类库
他和JDK不同的是,他只是一个运行环境,并不是开发环境,因此JRE并没有任何开发工具(编译器、调试器等);
JRE是指java运行环境,只有JVM还不能运行.class文件,因为在解释class的时候JVM需要调用解释所需要的类库lib(jre里有运行.class的java.exe)


4、详细介绍JVM

JVM全称Java Virtual Manchine,就是我们常说的java虚拟机
JVM是java实现跨平台的核心部分,所有的java代码首先被编译为.class文件,这种类文件可以在虚拟机上运行,也就是说.class文件并不直接与机器的操作系统相对应,而是经过虚拟机间接的与操作系统交互,由虚拟机将程序解释给本地系统执行,只有jvm还不能将class执行,因为在解释class的时候jvm需要调用解释所需要的类库lib,而jre包含lib类库,jvm屏蔽了具体操作系统平台的相关信息,使得java程序只需要生成在java虚拟机上运行的目标代码。可以在多种平台(操作系统)上不加修改的运行


JVM首先要把字节码通过类加载器(ClassLoader) 把文件加载到内存中的运行时数据区(Runtime Data Area) ,而字节码文件是JVM的同一套指令集规范,并不能直接交给底层的操作系统去执行,因此需要特定的解析器执行引擎(Execution Engine)把字节码翻译成底层系统指令再交给CPU去执行,而这个过程需要调用其他语言接口本地库接口(Native Interface) 来实现整个程序的功能

1、JVM内部区域划分

JDK JRE JVM之间的关系
一个JVM进程中,堆区和方法区只有一份,栈和程序计数器每个线程都有自己的一份

堆:放的是new的对象
方法区:放的是类对象(加载好的类)
栈:放的是方法之间的调用关系
程序计数器:放的是下一个要执行的指令的地址

本地方法栈和虚拟机栈的区别:
1.虚拟机栈:(java里面用来保存调用关系的内存空间)
2.本地方法栈:本地方法,也就是JVM内部用c++写的代码,调用关系的内存空间


代码里的局部变量:栈区
代码里的成员变量:堆区
代码里的静态变量:方法区
举例:
JDK JRE JVM之间的关系

如上图所示:x是成员变量,所以在堆上;y是静态变量,所以在方法区;a是局部变量,所以在栈上

5、如何运行一个java程序?

1.使用记事本或者IDEA(java集成开发环境)编写java的源程序,生成.java文件
2.使用javac.exe编译器对.java文件进行编译,生成.class字节码文件;语法格式:javac xxx.java
3.使用JVM运行.class字节码文件;语法格式:java xxx.class
JDK JRE JVM之间的关系