浅谈java代码从编译到执行的整个流程

文章目录

  • 1.几个需要先知道的前置知识
  • 2.概述整个流程

1.几个需要先知道的前置知识

字节码文件
字节码文件,看似很微不足道的东西,却真正实现了java语言的跨平台。各种不同平台的虚拟机都统一使用这种相同的程序存储格式。更进一步说,jvm运行的是class字节码文件,只要是这种格式的文件就行,实际上jvm并不与java语言紧紧地捆绑在一起。如果非常熟悉字节码的格式要求,可以使用二进制编辑器自己写一个符合要求的字节码文件,然后交给jvm去运行;或者把其他语言编写的源码编译成字节码文件,交给jvm去运行,只要是合法的字节码文件,jvm都会正确地跑起来。字节码是跨平台的

JVM——java virtual machine
就是我们常说的java虚拟机,它是整个java实现跨平台的最核心的部分,所有的java程序会首先被编译为.class的类文件,这种类型的文件可以在虚拟机上执行,也就是说class文件并不直接与机器的操作系统相对应,而是经过虚拟机间接与操作系统交互,由虚拟机将程序解释给本地系统执行。(由虚拟机来把程序翻译为机器码)(不同硬件的机器码不同,每个操作系统的指令是不同的)

jre:java runtime environment
是指java运行环境。光有JVM还不能成class的执行,因为JVM在解释.class文件的时候它还需要调用解释所需要的类库lib。在JDK的安装目录里你可以找到jre目录,里面有两个文件夹bin和lib,在这里可以认为bin里的就是jvm,lib中则是jvm工作所需要的类库,而jvm和 lib和起来就称为jre。所以,在你写完java程序编译成.class之后,你可以把这个.class文件和jre一起打包发给朋友,这样你的朋友就可以运行你写程序了。(jre的lib只是运行java程序的jar包,是为JVM运行时候用的。包括所有的标准类库,和扩展类。)

JDK:java development kit
是java开发工具包,那它都包含哪几部分呢?让我们看一下JDK的安装目录。在目录下面有几个文件夹、一个src类库源码压缩包、和其他几个声明文件。其中,真正在运行java时起作用的是以下四个文件夹:bin、include、lib、 jre。

bin:该目录里用于存放一些可执行文件 。例如:javac.exe(java编译器),java.exe(java运行工具),jar.exe(java打包工具),Javadoc.exe(文档生成文件)等。javac编译器,这个编译器负责将.java文件编译为.class文件(.class文件里面是字节码),idea默认是用javac编译器来编译.java文件,其他编译软件可能是用自己的编译器来编译.java文件,比如Eclipse是用ECJ来编译.java文件的。java.exe 是java运行工具,它会启动一个Java虚拟机(jvm)进程。Java虚拟机相当一个虚拟的操作系统,它专门负责运行Java编译器生成的java字节码文件。

include:由于JDK是通过c和c++实现的,所以这个目录中存储了一些在启动时需要引入的一些c语言的头文件。java和JVM交互用的头文件

lib:JDK下的lib包括java开发环境的jar包,是给JDK用的,例如JDK下有一些工具,可能要用该目录中的文件。例如,编译器等。

jre:就是上述的jre

注意:jdk目录下的bin以及lib和jre目录下的完全不一样
浅谈java代码从编译到执行的整个流程_第1张图片

2.概述整个流程

刚才上述的流程我们就可以推出整个流程了:我们编写的代码先由javac编译器编译为.class文件(一个复杂的过程)(javac是因为我使用的idea),然后又是由java.exe去启动JVM进程,JVM再把.class文件加载到它自己的内存中(又是一个复杂的过程),然后再去执行程序(又是一个复杂的过程 java程序执行参考文章)。

浅谈java代码从编译到执行的整个流程_第2张图片

你可能感兴趣的:(#,JVM)