类加载机制

类加载过程本质上就是类加载器根据类的全限定名(包名+类名)去找到对应的class字节码文件内容,然后将字节码文件加载到虚拟机方法区的过程:image
image

按照虚拟机规范,从class文件加载到内存中的类、到类的卸载出内存为止,他的生命周期包含以下七个阶段。

  1. 加载:根据全限定名称去寻找这个class的字节码文件内容、然后根据字节码的内容翻译为JVM所熟知的class数据结构并且保存到内存当中。并且在内存中构建处Java类的原型(模板对象)。所谓的模板对象,就是Java类在JVM内存中的一个快照,这样JVM在运行期便可以通过类模板获取Java类的任意信息。反射机制便是基于这一基础,如果JVM没有将Java类的声明信息存储起来、则JVM在运行期也无法完成反射。
  • 通过类的全名,获取其二进制字节流
  • 解析类的二进制数据流转化为方法区的数据结构(Java类原型)
  • 创建java.lang.Class类的实例、表示该类型。作为方法区这个类的各种数据的访问入口。
  1. 验证: 为了防止字节码文件存在恶意信息,因此需要对其做一个校验。

  2. 准备: 为类的静态变量分配内存,并将其初始化为初始值。当类通过验证之后,虚拟机就会进入准备阶段,它回味这个类分配相应的内存空间,并设置默认初始值。

  3. 解析: 将常量池中的符号引用转化为直接引用,例如将其中的各种对象方法的符号名称转化为地址,以便可以直接调用该对象。

  • 非final 修饰的变量:在解析阶段进行初始化复制。
  • final 修饰的常量在解析环节会直接进行显示复制
  1. 初始化: 会将所有的静态变量的值进行一次初始赋值的操作,同时执行静态代码块。

  2. 使用:

其中的使用分为:主动使用和被动使用两种。
主动使用
Class 只有在必须要首次使用的时候才会被装载、Java虚拟机规定、一个类/接口在初次使用之前,必须进行初始化。这里的使用是指主动使用、主动使用只有以下几种情况(即出现如下情况,则会对类进行初始化操作。而初始化操作之前的加载、验证、准备、解析、初始化、已经完成,。)

  1. 卸载

当类被加载、链接、初始化之后,他的生命周期就开始了。当该类无法再次被创建之后就会被卸载。

posted @ 2019-10-21 19:48  X-POWER  阅读(598)  评论(0编辑  收藏  举报