类加载子系统及双亲委派机制


类加载子系统

image-20200705081813409

加载阶段

  1. 通过一个类的全限定名获取定义此类的二进制字节流

  2. 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构

  3. 在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口

JVM类加载器:引导类加载器、自定义类加载器

在程序中我们最常见的类加载器始终只有3个

这三个事包含关系 (类似 嵌套的文件夹)

Java的核心类库都是引导类加载器加载的。

引导类加载器:jre/lib/rt.jar 等核心类库,c++编写

扩展类加载器:jre/lib/ext目录

系统类加载器:classpath

链接阶段

验证 Verify

目的在于确保Class文件的字节流中包含信息符合当前虚拟机要求,保证被加载类的正确性,不会危害虚拟机自身安全。

主要包括四种验证,文件格式验证,元数据验证,字节码验证,符号引用验证。

准备 Prepare

类变量分配内存并且设置该类变量的默认初始值,即零值。

解析 Resolve

常量池内的符号引用转换为直接引用的过程。

初始化阶段

初始化阶段就是执行类构造器法(clinit)的过程。

此方法不需定义,是javac编译器自动收集类中的所有类变量的赋值动作和静态代码块中的语句合并而来。

双亲委派机制

image-20200f70509419223

Java虚拟机对class文件采用的是按需加载的方式,也就是说当需要使用该类时才会将它的class文件加载到内存生成class对象。而且加载某个类的class文件时,Java虚拟机采用的是双亲委派模式,即把请求交由父类处理,它是一种任务委派模式。

工作原理

  • 如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行;
  • 如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器;
  • 如果父类加载器可以完成类加载任务,就成功返回,倘若父类加载器无法完成此加载任务,子加载器才会尝试自己去加载,这就是双亲委派模式。

好处

  • 避免类的重复加载
  • 保护程序安全,防止核心API被修改

在JVM中表示两个class对象是否为同一个类存在两个必要条件:

  • 类的完整类名必须一致,包括包名。
  • 加载这个类的ClassLoader(指ClassLoader实例对象)必须相同。

文章作者: Bxan
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Bxan !
  目录