准确阐述应用程序的编译、链接与装入过程?

发布于 2022-04-12  19 次阅读


编译:代码会被编译成机器码被操纵系统执行,包含相应指令、操作码、和若干参数等。由编译程序Compiler将源代码编译成若干个目标模块,翻译成机器语言。在生成机器指令时并不知道该进程的数据会被放到什么位置,所以编译时生成的指令中一般是使用逻辑地址。

链接:由链接程序Linker将编译后形成的一组目标模块,以及所需库函数链接在一起,形成一个完整的装入模块(可执行文件)。

装入:可执行文件只有被装载到内存以后才能被CPU执行,由装入程序Loader将装入模块装入内存运行.。

在我们编写好的java程序后,有一个java源程序文件是以.java结尾的。我们可以通过jdk携带的javac.exe这个编译器来编译我们的java源程序

编译完成后,会生成一个.class结尾的文件,也是因为有了这个文件,使得我们的字节码文件能够在不同的操作系统上去运行,从而实现跨平台执行。

在jvm中的类加载器通过网络或在本地的磁盘上将需要的字节码文件加载到内存中去。那么,类加载具体是怎么做的呢?
JVM启动后,默认会有几种类加载器:

启动类加载器 bootstrapClassLoader,非java语言实现
作用:加载指定路径中jar里面的class文件
路径1:C:\Program Files\Java\jdk1.8.0_74\jre\lib
路径2:C:\Program Files\Java\jdk1.8.0_74\jre\classes\ ( 如果有这个目录的话)
例如:rt.jar
扩展类加载器 ExtClassLoader,java语言实现,是ClassLoader类型的对象
作用:加载指定路径中jar里面的class文件( 只能是jar中存在的class)
路径:C:\Program Files\Java\jdk1.8.0_74\jre\lib\ext
例如:ext中默认存在的jar,或者用户放到ext目录下的jar包
z应用类加载器 AppClassLoader,java语言实现,是ClassLoader类型的对象
作用:加载指定路径中class文件或者jar里面的class文件
路径:CLASSPATH中配置路径,这个是用户自己配置的
例如:.:bin:hello.jar

在这里插入图片描述

应用加载器在接到请求后,会将请求向上传递,拓展加载器也向上传递,直到到了启动加载器这里,开始去到相应的目录寻找所需要的字节码文件,当它不满足所有要求时,下一级加载器去目录中查找目录,当它又不满足时,又通过应用加载器来加载字节码文件。