Java基础-类加载

类加载过程

  • 类加载过程由几个步骤:加载、验证、准备、解析、初始化
    • 加载:指读取class文件到内存;
    • 验证:验证读取的class文件,保证文件合法、格式正确;
    • 准备:申请内存空间并进行第一次初始化,静态变量常量等,在方法区中分配;
    • 解析:将类中的符号引用替换成直接引用;
    • 初始化:为执行类初始化构造器,静态变量常量赋值,执行static代码块
  • 加载时机:
    • 使用new对象
    • 访问类的静态变量(常量不会,常量被优化了,像C语言的宏替换)、静态方法
    • 使用子类,会先初始化父类
    • 使用反射调用类
    • 启动main方法所在的类
    • 不加载情况
      • 使用new某个类的数组,该类不会被初始化
      • 使用某个类的常量
      • 使用某个类的父类的静态变量,这个类不会被初始化

类加载器

  • 类的加载工作有类加载器完成。java自带的加载器包括,启动加载器、拓展加载器、应用加载器,还有开发者可以自定义类加载器。
  • 类加载器之间工作是有父子关联的层次关系,称为双亲委派模型。当加载一个类时,类加载器会先委托父加载器加载类,知道启动加载器。当父加载器加载失败时,再尝试自己加载该类。
  • 双亲原因:保证java类和类加载一起具有层次,类不会被重复加载;安全因素,java核心类不会被随意替换篡改。

tomcat类加载,热部署&热加载

Common类加载器,负责加载Tomcat和Web应用都复用的类

  • Catalina类加载器,负责加载Tomcat专用的类,而这些被加载的类在Web应用中将不可见
  • Shared类加载器,负责加载Tomcat下所有的Web应用程序都复用的类,而这些被加载的类在Tomcat中将不可见
    • WebApp类加载器,负责加载具体的某个Web应用程序所使用到的类,而这些被加载的类在Tomcat和其他的Web应用程序都将不可见
    • Jsp类加载器,每个jsp页面一个类加载器,不同的jsp页面有不同的类加载器,方便实现jsp页面的热插拔
  • tomcat7之后,CommonClassLoaderCatalinaClassLoaderSharedClassLoader合并成一个CommonClassLoader

加载顺序:

热部署&热加载:

  1. 热部署和热加载是类似的,都是在不重启Tomcat的情况下,使得应用的最新代码生效。
  • 热部署表示重新部署应用,它的执行主体是Host,表示主机。
  • 热加载表示重新加载class,它的执行主体是Context,表示应用。

热部署和热加载都通过一个后台线程监听相应的文件或文件夹是否发生了变化完成的,监听到有变化则执行相应的热操作。

  1. Tomcat使用多个WebAppClassLoader实现类加载的隔离,每个Web应用程序都有一个独立的ClassLoader,这可以确保每个Web应用程序之间的类是相互隔离的。每个Web应用程序的ClassLoader维护了自己的类加载路径,可以加载Web应用程序中的类以及Web应用程序所依赖的类。