java类加载机制(windows)

流程

image.png

一、执行run方法后java.exe调用jvm.dll文件建立jvm虚拟
二、建立虚拟机的过程当中建立出引导类加载器实例(c++)
三、c++代码调用java代码建立jvm启动器
sum.misc.Launcher.getLauncher()
四、launcher.getClassLoader()进行java类的加载
image.png
加载-》验证-》准备—》解析—》初始化

1.验证:验证格式是否正确
2.准备:静态变量初值始赋值 Ex:int=0,boolean=false   
3.解析:符号引用替换为直接引用(静态引用)
4.初始化:初始化静态变量和静态代码
五、执行类中的main方法
六、执行结束,销毁JVM

细节

java类加载器分为四层
引导类加载器、扩展类加载器、应用程序类加载器、自定义加载器

image.png

顶级加载器为引导类加载器BootstrapClass,该加载器为C++代码实现,负责加载支持jvm运行的jdk下lib目录下的核心类,E.x:java.lang.String类
bootstrapLoader加载如下文件:java

file:/C:/Program%20Files/Java/jdk1.8.0_271/jre/lib/resources.jar
file:/C:/Program%20Files/Java/jdk1.8.0_271/jre/lib/rt.jar
file:/C:/Program%20Files/Java/jdk1.8.0_271/jre/lib/sunrsasign.jar
file:/C:/Program%20Files/Java/jdk1.8.0_271/jre/lib/jsse.jar
file:/C:/Program%20Files/Java/jdk1.8.0_271/jre/lib/jce.jar
file:/C:/Program%20Files/Java/jdk1.8.0_271/jre/lib/charsets.jar
file:/C:/Program%20Files/Java/jdk1.8.0_271/jre/lib/jfr.jar
file:/C:/Program%20Files/Java/jdk1.8.0_271/jre/classes

二级加载器为扩展类加载器ExtClassLoader,该加载器为java代码实现,负责加载支持jvm运行的的jdk中的lib文件下ext中的扩展包c++

C:\Program Files\Java\jdk1.8.0_271\jre\lib\ext;
C:\Windows\Sun\Java\lib\ext

三级加载器为AppClassLoader负责加载classPath目录下的文件,主要就是编写的业务实现类
appClassLoader加载如下文件:web

C:\Program Files\Java\jdk1.8.0_271\jre\lib\charsets.jar;
C:\Program Files\Java\jdk1.8.0_271\jre\lib\deploy.jar;
C:\Program Files\Java\jdk1.8.0_271\jre\lib\ext\access-bridge-64.jar;
C:\Program Files\Java\jdk1.8.0_271\jre\lib\ext\cldrdata.jar;
C:\Program Files\Java\jdk1.8.0_271\jre\lib\ext\dnsns.jar;
C:\Program Files\Java\jdk1.8.0_271\jre\lib\ext\jaccess.jar;
C:\Program Files\Java\jdk1.8.0_271\jre\lib\ext\jfxrt.jar;
C:\Program Files\Java\jdk1.8.0_271\jre\lib\ext\localedata.jar;
C:\Program Files\Java\jdk1.8.0_271\jre\lib\ext\nashorn.jar
;C:\Program Files\Java\jdk1.8.0_271\jre\lib\ext\sunec.jar;
C:\Program Files\Java\jdk1.8.0_271\jre\lib\ext\sunjce_provider.jar;
C:\Program Files\Java\jdk1.8.0_271\jre\lib\ext\sunmscapi.jar;
C:\Program Files\Java\jdk1.8.0_271\jre\lib\ext\sunpkcs11.jar;
C:\Program Files\Java\jdk1.8.0_271\jre\lib\ext\zipfs.jar;
C:\Program Files\Java\jdk1.8.0_271\jre\lib\javaws.jar;
C:\Program Files\Java\jdk1.8.0_271\jre\lib\jce.jar;
C:\Program Files\Java\jdk1.8.0_271\jre\lib\jfr.jar;
C:\Program Files\Java\jdk1.8.0_271\jre\lib\jfxswt.jar;
C:\Program Files\Java\jdk1.8.0_271\jre\lib\jsse.jar;
C:\Program Files\Java\jdk1.8.0_271\jre\lib\management-agent.jar;
C:\Program Files\Java\jdk1.8.0_271\jre\lib\plugin.jar;
C:\Program Files\Java\jdk1.8.0_271\jre\lib\resources.jar;
C:\Program Files\Java\jdk1.8.0_271\jre\lib\rt.jar;e:\IdeaProjects\demo3\target\classes;
C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter-web\2.4.2\spring-boot-starter-web-2.4.2.jar;
C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter\2.4.2\spring-boot-starter-2.4.2.jar;
C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot\2.4.2\spring-boot-2.4.2.jar;
C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-autoconfigure\2.4.2\spring-boot-autoconfigure-2.4.2.jar;
C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter-logging\2.4.2\spring-boot-starter-logging-2.4.2.jar;
C:\Users\Administrator\.m2\repository\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;
C:\Users\Administrator\.m2\repository\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;
C:\Users\Administrator\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.13.3\log4j-to-slf4j-2.13.3.jar;
C:\Users\Administrator\.m2\repository\org\apache\logging\log4j\log4j-api\2.13.3\log4j-api-2.13.3.jar;
C:\Users\Administrator\.m2\repository\org\slf4j\jul-to-slf4j\1.7.30\jul-to-slf4j-1.7.30.jar;
C:\Users\Administrator\.m2\repository\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;
C:\Users\Administrator\.m2\repository\org\yaml\snakeyaml\1.27\snakeyaml-1.27.jar;
C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter-json\2.4.2\spring-boot-starter-json-2.4.2.jar;
C:\Users\Administrator\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.11.4\jackson-databind-2.11.4.jar;
C:\Users\Administrator\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.11.4\jackson-annotations-2.11.4.jar;
C:\Users\Administrator\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.11.4\jackson-core-2.11.4.jar;
……………………因为加载太多,此处省略…………………………

四级加载器为用户自定义加载器,实现方式和三级加载器相似,可自定义loadClass方法调用父类loadClass方法实现类的加载。spring

双亲委派机制

java类加载器的加载顺序以下图所示
image.png
AppClassLoader逻辑上的父级加载器为ExtClassLoader,Ext的父级则是BootstrapClassLoader
类加载的顺序是由APP首先检查自身是否已经加载过,若是没有,调用父级ExtClassLoader,若是ExtClassLoader也没有加载过则调用BootstrapClassLoader,三级加载器会从最高级开始在本身的加载范围内寻寻找类型,若是没有找到则交给子集类加载器进行加载。
逻辑顺序是3-2-1进行查找,都没有找到则从1-2-3顺序新建,建立成功或者查找到后则直接返回apache

> 如何打破双亲委派机制

实现自定义加载器,重构classLoad()方法的实现,跳过双亲委派逻辑即刻json

相关文章
相关标签/搜索