类的加载
七个阶段:加载,验证,准备、解析、初始化、使用和卸载七个阶段。
类的加载器任务就是根据一个类的全限定名来读取此类的二进制字节流到JVM中,然后转换为一个与目标类的java.lang.class对象实例
1. JVM加载器
1)AppClassLoader : 负责加载CLASSPATH指定的所有jar或目录,应用加载器。
2)ExtClassLoader : JRE/lib/ext/*.jar 扩展类加载器
3)Boostrap : JRE/lib/rt.jar 根类加载器(C艹底层)
双亲委派机制:当加载某类时,1)-> 2) -> 3) 向上委任,如果3)没找到,就往下找
1. 加载过程(加载)
1)加载
类的加载是指将类的class文件中的二进制数据读入内存中,将其存放在运行时的数据区域的方法区内,在队中创建java.lang.class对象,用来封装在方法区的数据结构,这样运行后java虚拟机才会创建class对象。
Java虚拟机有预加载功能,即便不使用某些类,JVM也可以预测加载它,但直到调用后才有报错。
2. 类的连接(验证、准备、解析)
1)验证
将内存中的二进制数据放入虚拟机运行环境中,检查类的文件结构是否符合规范,检验字节码是否可被执行。
2)准备
为静态变量分配内存,并赋予初始值。
3)解析
符号引用->直接引用。
3. 类的初始化(6中方法)
1)创建对象的实例
2)调用类的静态属性
3)调用类的静态方法
4)通过class文件反射创建对象
5)初始化一个类的子类(使用子类前,先初始化父类)
6)初始化启动类Main
4. 结束
1)system.exit()
2)程序正常结束
3)程序抛出异常
4)操作系统异常