目录
1.JVM类加载机制过程
类加载机制分为五个过程:加载;连接(验证、准备、解析);初始化;使用;卸载
2.加载
在内存中产生一个代表该类的java.lang.Class对象
3.连接
验证:确保Class文件的字节流中包含的信息是否符合虚拟机的要求,不会危害虚拟机安全
准备:为类变量分配内存和设置变量的初始值;此时的赋值是为静态变量赋值
有final的静态变量直接赋值
没有final的静态变量赋默认值
解析:虚拟机将常量池中的符号引用替换为直接引用
4.初始化
按照Java程序顺序对没有final的静态变量赋值,同时执行静态代码块内容;
若类的父类未初始化,则应该先为父类进行初始化
5.使用
类加载完后,进行使用。此时可以完成类的实例变量(非静态变量)的初始化。
6.卸载
使用完后卸载Java类,但需要满足几个条件:
类的所有对象被清除;
类的对象是不可达的,即没有引用关系;
加载类的ClassLoader已经被回收
7.符号引用
符号引用与虚拟机内存布局无关,且引用的目标并不一定已经加载到内存中
虚拟机的内存布局可以不一样,但是符号引用必须一致
8.直接引用
1.直接引用是将Class文件中的符号引用转换为真实的内存地址
2.直接引用是指向目标的指针或者能简介定位到目标的句柄
3.直接引用的目标必须在内存中存在
9.Java提供的类加载器
启动类加载器(Bootstrap ClassLoader)
加载JAVA_HOME\lib目录,或者被虚拟机认可、通过-Xbootclasspath参数指定路径的类
扩展类加载器(Extension ClassLoader)
加载JAVA_HOME\lib\ext目录,或者通过java.ext.dirs系统指定路径中的类库
应用程类加载器(Application ClassLoader)
加载用户路径的类库,使用双亲委派模型进行类加载;也可以使用ClassLoader实现自定义类的加载器
10.双亲委派
每一个类收到类加载请求,都先将请求委派给父类完成,从而所有的加载请求都会传送到启动类加载器中,只有父类无法完成请求,才由子类加载。