详解类加载机制

类加载指的是将编译好的Class类文件中的字节码读入内存中。主要分为加载、验证、准备、解析、初始化等步骤,如下图所示:


image.png
  1. 加载是指class文件到内存的过程。

  2. 验证是指对类文件内容验证。目的是确保Class文件符合当前虚拟机规范,且不影响虚拟机的正常运行,主要包括:文件格式验证,元数据验证,字节码验证,符号引用验证。

3.准备阶段是进行内存分配。对类变量分配内存,并且设置初始值,这里要注意,初始值是 0 或者 null,而不是代码中设置的具体值,代码中的赋值是在初始化阶段完成的,另外这里也不包含final修饰的静态变量,因为finai在编译的时间就会分配。

  1. 解析主要是解析字段、接口、方法。主要是将常量池中的符号引用替换为直接引用。

5,初始化,主要完成静态块执行与静态变量的赋值。这是类加载最后阶段,若被加载类的父类没有初始化,则先对父类进行初始化。

只有对类主动使用时,才会进行初始化,初始化的触发条件包括在创建类的实例时,访问类的静态方法或者静态变量时,Class.foName()反射类时,或者某个子类被初始化时。

详解类加载器

image.png

如上图所示,自带的三种类加载器分别是:启动类加载器、扩展类加载器、应用加载器。右边分别对应加载的目录。除此之外,还可以定义类加载器。

Java的类加载器使用双亲委派模式,一个类加载器在加载类时,先把这个请求委托给自己的父类加载器去执行,如果父类加载器还有父类加载器,则继续向上委托,直到顶层启动类加载器,如果父类加载器无法完成加载,则由子加载器尝试自己加载。如图中橘黄色的箭头。

优点:这种双亲委派模式的好处,可以避免类的重复加载,另外也可以避免Java核心API被篡改。

你可能感兴趣的:(详解类加载机制)