类加载器:负责加载编译后的class文件(字节码文件)到JVM当中。
在JRE中,类加载器主要分为以下几种:
1)引导类加载器(Bootstrap)
它本身使用C语言实现的,负责加载Java的核心类库,在jrelib目录中,当中包括如rt.jar,这些都是Java自带的核心类库,必须由它来完成加载。
2)扩展类加载器(Extention)
这个加载器就是由Java语言实现,负责加载jrelibext目录下的类库,这个目录下的类库都是一些扩展类。
3)系统类加载器(App)
这个类加载器同样使用Java语言实现,它主要负责加载classpath下面的所有类库,通常我们编写的Java类都是由这个类加载器完成加载。
双亲委托模型:
三个类加载器的初始化过程,当程序运行时,首先会初始化引导类加载器,它就负责创建和初始化扩展类加载器,当扩展类加载器完成初始化之后,
又负责创建和初始化系统类加载器,这些类加载器协同起来完成整个类加载的过程,因此这些类加载器的加载模式是基于“双亲委托模型”。
举例说明:当我们编写一个Java类时,首先负责加载这个类的加载器是系统类加载器,但是它不会立马就去执行加载,而是先把这个任务交给父加载器(扩展类加载器),而扩展类加载器同样也会将这个任务交给父加载器(引导类加载器),最终当引导类加载器不能去加载这个类的时候(也就是在自己加载职责范围找不到的时候),又会将这个任务交回给子加载器。以此类推,最终我们编写的类都会配置在classpath环境中,所以,这个类的加载任务还是回到系统类加载器来完成。
当一个class文件最终加载到jvm之后,就表示类加载这个阶段已经全部完成。接下来就是对整个class文件的内容进行解析和做内存的分配