执行Java代码的过程: 执行Java.exe调用JVM.dll创建Java虚拟机 -> 调用由c++编写的引导类加载器,该类加载器会加载核心类库 -> 调用sun.misc.Launcher的构造方法会创建Launcher类对象,在该构造方法中会创建扩展类加载器和应用类加载器
执行过程如下图所示
因为Java类加载模式是懒加载,所以并不会在一开始就将所用类一次性加载到JVM中,会根据双亲委派机制对类进行加载。
引导类加载器: 用于加载核心类库,比如rt.jar、或String.class,引导类加载器为最上层加载器,加载的目录为\JDK\1.8\jre\lib
扩展类加载器:用于加载扩展类包,扩展类加载器在引导类加载器下层,加载目录为JDK\jre\lib\ext
应用类加载器:用于加载用户自定义的类,加载目录为target目录下的class文件。
自定义类加载器: 用户自定义类加载器,加载目录可以自定义。
加载:将class文件以二进制数组读取到内存中。
验证:校验class文件的字节码是否符合规则。
初始化:给静态变量分配内存并设置默认值。
解析:将符号引用转换为直接引用,该阶段会将静态符号引用转换为内存地址值用于执行,这个过程被称为静态链接,动态链接是指在程序执行过程中进行符号引用转换。
初始化:为静态变量赋值并执行静态语句块。
符号引用:符号就是在Java文件