类的生命周期会经历 加载 -> 验证 -> 准备 -> 解析 -> 初始化 -> 使用 -> 卸载 几个阶段,其中验证、准备、解析合并称作连接。类的加载过程会经历加载、连接、初始化三个阶段。
下面我们来分别总结一下每个阶段的工作
加载(loading)是将类对应的class文件读取到内存中,并为该类创建一个Class<T>对象的一个过程。类加载是通过类加载器完成的。
通过类的全限定名来获取定义此类的二进制字节流,将这个类字节流代表的静态存储结构转为方法区的运行时数据结构,在堆中生成一个Class<T>对象,作为访问方法区这些数据结构的入口。
连接(Linking)
初始化(Initializing)执行类或者接口的初始化方法。
为方便理解我们将类的加载过程用图形的方式展示出来:
上图已经总结有会对类进行初始化的节点:
类加载器负责所有类的加载。类加载器可以分为启动类加载器、扩展类加载器、应用程序加载器、用户自定义加载器。
除启动类加载器(虚拟机本身的实现)外都会存在一个父加载器,父子关系如下图所示。
当类加载器接收到类的加载指令后并不会立刻进行类加载,而是询问父加载器是否可以进行加载,父加载器又会执行相同动作直至询问启动类加载器。
启动类加载器会确认需要加载的类是否为自己的加载范围内,如果不是则反馈子加载器可以进行加载,依次返回直至找到可以进行加载的类加载器。
这种类加载器之间的层次关系就是类加载器的双亲委派模型。
参考文献:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-5.html
原文:https://www.cnblogs.com/longc-pub/p/11593152.html