一、执行run方法后java.exe调用jvm.dll文件建立jvm虚拟
二、建立虚拟机的过程当中建立出引导类加载器实例(c++)
三、c++代码调用java代码建立jvm启动器
sum.misc.Launcher.getLauncher()
四、launcher.getClassLoader()进行java类的加载
![]()
加载-》验证-》准备—》解析—》初始化 1.验证:验证格式是否正确 2.准备:静态变量初值始赋值 Ex:int=0,boolean=false 3.解析:符号引用替换为直接引用(静态引用) 4.初始化:初始化静态变量和静态代码
五、执行类中的main方法
六、执行结束,销毁JVM
java类加载器分为四层
引导类加载器、扩展类加载器、应用程序类加载器、自定义加载器
顶级加载器为引导类加载器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类加载器的加载顺序以下图所示
AppClassLoader逻辑上的父级加载器为ExtClassLoader,Ext的父级则是BootstrapClassLoader
类加载的顺序是由APP首先检查自身是否已经加载过,若是没有,调用父级ExtClassLoader,若是ExtClassLoader也没有加载过则调用BootstrapClassLoader,三级加载器会从最高级开始在本身的加载范围内寻寻找类型,若是没有找到则交给子集类加载器进行加载。
逻辑顺序是3-2-1进行查找,都没有找到则从1-2-3顺序新建,建立成功或者查找到后则直接返回apache
实现自定义加载器,重构classLoad()方法的实现,跳过双亲委派逻辑即刻json