Java的类加载过程 - 《Java核心技术》

Java类加载步骤

  1. 加载:将字节码数据从不同的数据源读取到JVM中,并映射为JVM认可的数据结构;
  2. 链接:把原始类定义信息平滑的转化入JVM,包括:
    • 验证:验证字节信息是符合Java虚拟机规范的。
    • 准备:创建类或接口中的静态变量,并初始化静态变量的初始值。
    • 解析:将常量池中的符号引用替换为直接引用。
  3. 初始化:真正执行类初始化的代码逻辑,包括静态字段赋值、执行类定义中的静态初始化块内的逻辑。

双亲委派模型

简单来说就是当类加载器试图加载某个类型的时候,除非父加载器找不到相应类型,否则尽量将这个任务代理给当前加载器的父加载器去做,使用委派模型的目的是避免重复加载Java类型。

Java的类加载器

  • 启动类加载器,加载jre/lib下的jar文件,比如rt.jar。
  • 扩展类加载器,加载jre/lib/ext/目录下的jar包
  • 应用类加载器,加载我们最熟悉的classpath的内容。

35a3bc241d779ddcc357639547917ca1

如果不同类加载器都自己加载需要的某个类型,那么就会出现多次重复加载,产生资源浪费。

类加载器的特征

  • 双亲委派模式。但不是所有的类加载都遵循这个模型。有时候,启动类加载器需要加载用户代码,比如JDK内部的ServiceProvider/ServiceLoader机制,用户可以在标准API框架上提供自己的实现。这时候会使用上下文加载器。
  • 可见性。子类加载器可以访问父类加载器加载的类型,反过来不行。
  • 单一性。由于父加载器的类型对子加载器可见,所以父加载器加载过的类型,就不会在子加载器中重复加载。
comments powered by Disqus