java的3大加载器
-
引导类加载器
BootStrapClassLoader
-
扩展类加载器
ExtensionClassLoader
-
应用程序类加载器
ApplicationClassLoader
三大类加载器可以简单的理解为:
BootStrapClassLoader
加载的是JVM核心类的类库
ExtensionClassLoader
加载的是扩展类的类库
ApplicationClassLoader
加载我们自己写的java类类库
类的加载器加载了哪些类库
jdk1.8中BootStrapClassLoader
加载D:\Program Files\Java\jdk1.8.0_201\jre\lib
下的
- resources.jar
- rt.jar
- sunrsasign.jar
- jsse.jar
- jce.jar
- charsets.jar
- jfr.jar
以及D:/Program Files/Java/jdk1.8.0_201/jre/classes
文件夹下的class文件
ExtensionClassLoader
加载java的扩展类类库
D:\Program Files\Java\jdk1.8.0_201\jre\lib\ext
例如
- access-bridge-64.jar
- cldrdata.jar
- dnsns.jar
- jaccess.jar
- jfxrt.jar
- localedata.jar
- nashorn.jar
- sunec.jar
- sunjce_provider.jar
- sunmscapi.jar
- sunpkcs11.jar
- zipfs.jar
ApplicationClassLoader
加载应用程序的类
java应用程序启动的过程:
- 首先
.java
文件被javac编译成.class
文件。 - 当我们启动
java程序
的时候,.class
文件通过类加载子系统加载到内存中,类加载子系统分为3大加载器(BootStrapClassLoader、ExtensionClassLoader、ApplicationClassLoader
)。
首先需要加载java基础的类库(上面有介绍),也就是BootStrapClassLoader
加载java类库,当引导类加载器加载完毕后,接着ExtensionClassLoader
加载扩展类类库,再接着就是ApplicationClassLoader
将main方法所在的类加载到内存中。
在程序的运行过程中会使用到其它类文件,加载除main方法以为的类时,存在 类的双亲委托机制 以及 沙箱机制,可以简单的理解为先询问BootStrapClassLoader
有没有将类加载到内存,如果没有再询问ExtensionClassLoader
有没有将这个类加载到内存,如果前面都没有加载才会使用ApplicationClassLoader
进行加载。BootStrapClassLoader、ExtensionClassLoader
他们加载的类路径是固定的,因此他们加载的类也是比较固定的(除非将自己的类放到类库路径下)。 - 类的加载子系统又进一步分为:加载、链接、初始化。
类加载到内存中会经过加载、验证、准备、解析、初始化(主要是 静态成员变量、静态代码块 的初始化
),初始化完成后才算加载到内存中