一、类加载图解
1、类加载机制
A) 类的加载指将编译好的 Class 类文件中的字节码读入内存中,将其放在方法区内并创建对应的 Class 对象。
B) 类的加载分为加载、链接、初始化,其中链接又包括验证、准备、解析三步。
二、类加载过程解释
1、加载 (文件=> 内存)
通过类的完全限定名查找此类字节码文件,并利用字节码文件创建一个 Class 对象。
2、验证 (类文件验证)
A) 目的:确保 Class 文件符合当前虚拟机要求,不会危害虚拟机自身安全。
B) 主要包括四种:文件格式验证,元数据验证,字节码验证,符号引用验证
3、准备 (进行内存分配)
A) 为类中由 static 修饰的变量分配内存,并且设置初始值(0 或null)。
B) 代码中设置的具体值是在初始化阶段完成的。
C) 不包含用 final 修饰的静态变量,因为 final 在编译的时候就会分配。
4、解析 (解析字段、接口、方法)
A) 主要是将常量池中的符号引用替换为直接引用的过程。
B) 直接引用就是直接指向目标的指针、相对偏移量等。
5、初始化 (完成静态块执行与静态变量的赋值)
A) 若被加载类的父类没有初始化,则先对父类进行初始化。
B) 只有对类主动使用时,才会进行初始化,初始化的触发条件包括在创建类的实例时、访问类的静态方法或者静态变量时、Class.forName() 反射类时、或者某个子类被初始化时。
6、注意
A) 生命周期,就是从类的加载到类实例的创建与使用,再到类对象不再被使用时可以被 GC 卸载回收。
B) 由 Java 虚拟机自带的三种类加载器加载的类在虚拟机的整个生命周期中是不会被卸载的,只有用户自定义的类加载器所加载的类才可以被卸载。
三、类加载器
1、图解
2、说明
A) ,Java 自带的三种类加载器分别是:BootStrap 启动类加载器、扩展类加载器和应用加载器(也叫系统加载器)。
B) 启动类加载器加载 java home 中 lib 目录下的类,扩展加载器负责加载 ext 目录下的类,应用加载器加载 classpath 指定目录下的类。除此之外,可以自定义类加载器。
C) Java 的类加载使用双亲委派模式,一个类加载器在加载类时,先把这个请求委托给自己的父类加载器去执行,如果父类加载器还存在父类加载器,就继续向上委托,直到顶层的启动类加载器,如果父类加载器能够完成类加载,就成功返回,如果父类加载器无法完成加载,那么子加载器才会尝试自己去加载。
D) 双亲委派模式的好处,可以避免类的重复加载,另外也避免了 Java 的核心 API 被篡改。
其他文章
https://www.jianshu.com/p/3556a6cca7e5
https://www.jianshu.com/p/202f6abb229c
https://www.cnblogs.com/zhengbin/p/5631363.html
https://www.cnblogs.com/xiaoxian1369/p/5498817.html
https://www.jianshu.com/p/dd39654231e0