一.Java从编译到运行的过程
1.图示(JDK,JRE,JVM三者关系)
java
文件经过javac
的编译后形成了class
字节码文件,然后送入JVM在JRE的类库的帮助下进行类加载。从这张图也可以看出JDK,JRE,JVM之间的关系。
2.三者关系
- JVM: JVM只是一个翻译,把Class翻译成机器识别的代码,但是需要注意,JVM 不会自己生成代码,需要大家编写代码,同时需要很多依赖类库,这个时候就需要用到JRE。
- JRE: JRE是什么,它除了包含JVM之外,还提供了很多的类库(就是我们说的jar包,它可以提供一些即插即用的功能,比如读取或者操作文件,连接网络,使用I/O等等之类的)这些东西就是JRE提供的基础类库。JVM 标准加上实现的一大堆基础类库,就组成了 Java 的运行时环境,也就是我们常说的 JRE(Java Runtime Environment)。
- JDK: 但对于程序员来说,JRE还不够。我写完要编译代码,还需要调试代码,还需要打包代码、有时候还需要反编译代码。所以我们会使用JDK,因为JDK还提供了一些非常好用的小工具,比如
javac
(编译代码)、javap
(反编译)等。这个就是JDK。
二.JVM是一种规范
为什么说JVM是一种规范呢?有以下两个原因
①JVM的跨平台性
同一个Java程序,可以在多个不同的操作系统上执行,不受平台的影响(当然前提是你安装了属于此平台的JDK)。比如安装了windows版本的JDK,我的Java程序就可以在windows操作系统上面运行。
②JVM的语言无关性
JVM识别的就是class文件,不管你是什么语言,Java也好,kotlin也好,还是你自己创的语言也好,只要能编译成class文件,JVM就能识别并进行操作。
综上,我们说JVM是一种规范。
常见的JVM实现有