流程

image.png

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

1.验证:验证格式是否正确
2.准备:静态变量初值始赋值 Ex:int=0,boolean=false   
3.解析:符号引用替换为直接引用(静态引用)
4.初始化:初始化静态变量和静态代码

5、执行类中的main方法
6、执行结束,销毁JVM

细节

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

image.png

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

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:\Program Files\Java\jdk1.8.0_271\jre\lib\ext;
C:\Windows\Sun\Java\lib\ext

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

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方法实现类的加载。

双亲委派机制

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

> 如何打破双亲委派机制

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


Roy
13 声望1 粉丝

实用主义践行者,所学为所用,所用即所学。


下一篇 »
JVM整体结构

引用和评论

0 条评论