# windows系统下 .class 如何加载;
例如 com.alin.Math.class文件
1. jdk的由c++写的 java.exe执行文件调起jvm.dll文件创建java虚拟机;
2.创建一个引导类加载器实例;c++实现的
3.调用java代码创建jvm启动器实例:sun.misc.Launcher 该类由引导类加载器负责加载 并创建其他类加载器;
sun.misc.Launcher.getLauncher(),
4.然后获取运行类自己的加载器ClassLoader,是AppClassLoader的实例
5.调用loaderClass加载要运行的类 Math
classLoader.loaderClass("com.alin.Math")
6.加载完成后,jvm会执行Math类的main方法入口
#类加载过程:
加载->连接(验证、准备、解析)->初始化
加载 >> 验证 >> 准备 >> 解析 >> 初始化 >> 使用 >> 卸载
加载:在硬盘上找到文件并通过io读入字节码文件,使用到类时才会加载,例如调用main()方法。在加载阶段会在内存中生成一个代表这个类的java.lang.Class文件。作为方法区这个类的各种数据的访问入口
验证:校验字节码文件的正确性:是否符合jvm指令码规范。
准备:给类的静态变量分配内存,并赋初值!int a = 2; 赋初值时 a值为0;
解析:将符号引用替换为直接引用。该阶段会把静态方法(符号引用,main,类名等)替换为指向数据所存内存地址的位置,此过程为静态链接过程。 而动态链接
初始化:对类的静态变量初始化为指定值,并执行静态代码块。 static int b=2;此阶段 b值为2;
类加载到方法区后,主要包含:运行时常量池,类型信息,字段信息,方法信息,类加载器引用,对应class实例引用,
jvm类加载实例 懒加载,使用到该类的时候才去加载
#类加载器和双亲委派机制
引导类加载器:加载支持jvm运行的核心类库
扩展类加载器:加载支持jvm运行的扩展jar包类
应用程序类加载器:负责加载ClassPath下的类包,也就是我们自己实现的java文件
自定义类加载器:加载用户自定义路径下的类包;
加载顺序:引导类加载器>扩展类加载器>应用程序类加载器>自定义类加载器