JVM -- JVMJDKJRE

Posted MinggeQingchun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM -- JVMJDKJRE相关的知识,希望对你有一定的参考价值。

一、JDK(Java Development Kit;Java开发工具包)

JDK(Java Development Kit)即 Java开发工具包,Java的核心

JDK是提供给Java开发人员使用的,JDK是Java程序开发者用来来编译、调试Java程序用的开发工具包,也包括了JRE。所以安装了JDK,就不用在单独安装JRE了,除了包含JRE以外还包含了开发Java程序所必须的命令工具。其中的开发工具:编译工具(javac.exe) 打包工具(jar.exe)等

JDK的工具也是Java程序,也需要JRE才能运行。为了保持JDK的独立性和完整性,在JDK的安装过程中,JRE也是 安装的一部分。所以,在JDK的安装目录下有一个名为jre的目录,用于存放JRE文件

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

二、JRE(Java Runtime Environment;Java运行时环境)

JRE(Java Runtime Environment)即Java运行时环境

HRE包括JVM和Java程序所需的核心类库等。核心类库主要是java.lang包:包含了运行Java程序必不可少的系统类,如基本数据类型、基本数学函数、字符串处理、线程、异常处理类等,系统缺省加载这个包

如果想要运行一个开发好的Java程序,计算机中只需要安装JRE即可。JRE是Java运行环境,并不是一个开发环境,所以没有包含任何开发工具(如编译器和调试器),只是针对于使用Java程序的用户

三、JVM(Java Virtual Machine;Java虚拟机)

JVM(Java Virtual Machine)即Java虚拟机

JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的

Java虚拟机,它是整个Java实现跨平台的最核心的部分,所有的java程序会首先被编译为.class的类文件,这种类文件可以在虚拟机上执行

.class文件由编译器编译程序得到的二进制文件(.class文件)。不同的编译器,可以编译出相同的字节码文件,字节码文件也可以在不同的JVM上运行(具有跨平台性,一次编译,到处运行)

.class文件并不直接与机器的操作系统相对应,而是经过虚拟机间接与操作系统交互,由虚拟机将程序解释给本地系统执行。

只有JVM还不能构成.class文件的执行,因为在解释class的时候JVM需要调用解释所需要的类库lib,而JRE包含lib类库

JVM对于主流的操作系统都有相应的版本,目的就是将 统一的字节码 编译成对应操作系统识的二进制码,然后执行。JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的(字节码),就可以在多种平台上不加修改地运行。从而实现

Write once,Run Anywhere!

 从图中可以看到,有了JVM这个抽象层之后,Java就可以实现跨平台了。JVM只需要保证能够正确执行.class文件,就可以运行在诸如Linux、Windows、MacOS等平台上了

1、虚拟机

虚拟机(Virtual Machine)可以分为系统虚拟机和程序虚拟机:

(1)系统虚拟机:完全是对物理计算机的仿真,提供了一个可运行完整操作系统的软件平台,如Visual Box;

(2)程序虚拟机:专门为执行单个计算机程序而设计,其典型代表就是Java虚拟机(JVM),在Java虚拟机中执行的指令我们称为Java字节码指令

常见三种虚拟机:Oracle HotSpot、BEA JRockit、IBM J9

2、JVM特性

(1)自动内存管理

(2)自动垃圾回收机制(相比于C++)

(3)跨语言的平台,多语言混合编程

3、JVM类加载流程原理

4、JVM生命周期 

Java实例对应一个独立运行的Java程序(进程级别

1、启动

启动一个Java程序,一个JVM实例就产生。拥有public static void main(String[] args)函数的class可以作为JVM实例运行的起点。

2、运行

main()作为程序初始线程的起点,任何其他线程均可由该线程启动。JVM内部有两种线程:守护线程和非守护线程,main()属于非守护线程,守护线程通常由JVM使用,程序可以指定创建的线程为守护线程。

3、消亡

当程序中的所有非守护线程都终止时,JVM才退出;若安全管理器允许,程序也可以使用Runtime类或者System.exit()来退出。

JVM执行引擎实例则对应了属于用户运行程序线程它是线程级别的

四、JDK、JRE、JVM关系图

JDK1.8官网地址 

https://docs.oracle.com/javase/8/docs/index.html

JDK1.6官网地址

Java SE 6 Documentation

三者的包含关系:

JDK = JRE + 开发工具集(例如Javac编译工具等)

JRE = JVM + Java SE标准类库

JVM是不能独立安装的;JRE和JDK都是可以独立安装的

有单独的JDK安装包,也有单独的JRE安装包,没有单独的JVM安装包

安装JDK的时候:JRE就自动安装了,同时JRE内部的JVM也就自动安装了

安装JRE的时候:JVM也就自动安装了

.java文件加载和执行流程如下 

以上是关于JVM -- JVMJDKJRE的主要内容,如果未能解决你的问题,请参考以下文章

DOS命令Java语言开发环境(JVMJDKJRE)

Spark多种运行模式

线程生命周期与创建线程的多种方式

JVM

JVM 及 垃圾回收机制原理

jvm内存模型及分配