类加载机制
类加载过程本质上就是类加载器根据类的全限定名(包名+类名)去找到对应的class
字节码文件内容,然后将字节码文件加载到虚拟机方法区的过程:
按照虚拟机规范,从class
文件加载到内存中的类、到类的卸载出内存为止,他的生命周期包含以下七个阶段。
- 加载:根据全限定名称去寻找这个
class
的字节码文件内容、然后根据字节码的内容翻译为JVM
所熟知的class
数据结构并且保存到内存当中。并且在内存中构建处Java类的原型(模板对象)。所谓的模板对象,就是Java类在JVM
内存中的一个快照,这样JVM
在运行期便可以通过类模板获取Java
类的任意信息。反射机制便是基于这一基础,如果JVM
没有将Java
类的声明信息存储起来、则JVM
在运行期也无法完成反射。
- 通过类的全名,获取其二进制字节流
- 解析类的二进制数据流转化为方法区的数据结构(Java类原型)
- 创建
java.lang.Class
类的实例、表示该类型。作为方法区这个类的各种数据的访问入口。
-
验证: 为了防止字节码文件存在恶意信息,因此需要对其做一个校验。
-
准备: 为类的静态变量分配内存,并将其初始化为初始值。当类通过验证之后,虚拟机就会进入准备阶段,它回味这个类分配相应的内存空间,并设置默认初始值。
-
解析: 将常量池中的符号引用转化为直接引用,例如将其中的各种对象方法的符号名称转化为地址,以便可以直接调用该对象。
- 非final 修饰的变量:在解析阶段进行初始化复制。
- final 修饰的常量在解析环节会直接进行显示复制
-
初始化: 会将所有的静态变量的值进行一次初始赋值的操作,同时执行静态代码块。
-
使用:
其中的使用分为:主动使用和被动使用两种。
主动使用:
Class 只有在必须要首次使用的时候才会被装载、Java虚拟机规定、一个类/接口在初次使用之前,必须进行初始化。这里的使用是指主动使用、主动使用只有以下几种情况(即出现如下情况,则会对类进行初始化操作。而初始化操作之前的加载、验证、准备、解析、初始化、已经完成,。)
- 卸载
当类被加载、链接、初始化之后,他的生命周期就开始了。当该类无法再次被创建之后就会被卸载。