1.生命周期:

  • 加载:查找并加载类文件的二进制数据
  • 连接:将已经读入内存的类的二进制数据合并到JVM运行环境中去,包含如下步骤:

    1. 1.验证:确保被加载类的正确性<br /> 2.准备:为类的 静态变量 分配内存<br /> 3.解析:把常量池中的符号引用转换成直接引用
  • 初始化:为类的静态变量赋初始值

2.类加载完成的功能

  • 通过类的全限定名来获取该类的二进制字节流
  • 把二进制字节流转化为方法区的运行时数据结构
  • 在堆上创建一个java.lang.Class对象,用来封装类在方法区内的数据结构,并向外提供了访问方法区内数据结构的接口(通过反射)

    3.加载类的方式

  • 最常见方式:本地文件系统中加载、从jar等归档文件中加载

  • 动态的方式:将Java源文件动态编译成class
  • 其他方式:网络下载、从专有数据库中加载等


4.类加载器

  • Java虚拟机自带加载器
  1. 启动类加载器(BootstrapClassLoader).最基本的类加载器,本地语言编写,不需要被加载,直接被嵌套在虚拟机中(是虚拟机自身的一部分),该类加载负责加载 ${JAVA_HOME}/lib/ 路径下核心类库(rt.jar)或者 -Xbootclasspath 参数指定的路径下的jar包加载到内存中
  2. 平台类加载器(PlatfromClassLoader),Jdk1.8 扩展类加载器。该类加载器负责加载 ${JAVA_HOME}/lib/ext/目录下或者由系统变量 -Djava.ext.dir 指定位路径中的类库(改名原因:1.扩展类加载器主要加载jre环境下lib下的ext文件下jar包,当我们需要扩展,把jar放到该文件夹下,这种方式不是很安全;2.Jdk9引入模块化,这种扩展机制被模块化天然扩展能力取代)
  3. 应用程序类加载器(AppClassLoader).负责加载系统类路径java -classpath或-D java.class.path 指定路径下的类库,就是我们经常用到的classpath路径。一般情况下该类加载是程序中默认的类加载器,通过ClassLoader.getSystemClassLoader()就能获取。
  • 自定义类加载器:定制类的加载方式,自定义类加载器在所有系统类加载的最后。

5.类加载器的关系

image.png

6.类加载器说明

image.png

image.png