类加载机制

一: 类加载过程

  1. 何为类加载过程,即从开发编写的.java文件到编译成.class文件,然后加载到jvm中执行的过程。

1.1 具体加载过程

加载的详细流程为加载,验证,准备,解析,初始化,使用,卸载

其中加载,验证,准备,初始化的顺序是确定的,解析发生的时机也可能是初始化之后,这一点是为了支持java运行时绑定(动态绑定)

类加载过程是按顺序开始,并不是按顺序进行或完成,它们是交叉混合运行的

加载:在加载阶段,虚拟机需要完成以下三件事情

  • 通过一个类的全限定名来获取其定义的二进制字节流。
  • 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。
  • 在Java堆中生成一个代表这个类的java.lang.Class对象,作为对方法区中这些数据的访问入口

什么时候加载?

并不一定是首次用到该类时加载,JVM允许类加载器预料到某个类要被使用时,可以预先加载它,如果找不到该类,只会在第一次使用它时才报出来

加载class文件的方式

  • 从本地系统中直接加载
  • 通过网络下载.class文件
  • 从zip,jar等归档文件中加载.class文件
  • 从专有数据库中提取.class文件
  • 将Java源文件动态编译为.class文件

验证: 根据JVM规范来校验加载的.class文件

文件格式验证,元数据验证,字节码验证,符号引用验证

准备: 给类分配内存空间(方法取中),包含类变量及变量的初始化(默认赋值)

解析: 符号引用替换为直接引用

初始化: 为类的静态变量赋予正确的初始值,为类初始化

JVM初始化步骤

  • 假如这个类还没有被加载和连接,则程序先加载并连接该类
  • 假如该类的直接父类还没有被初始化,则先初始化其直接父类
  • 假如类中有初始化语句,则系统依次执行这些初始化语句

使用:类访问方法区内的数据结构的接口, 对象是Heap区的数据

卸载:结束生命周期

二: 类加载器

  1. 启动类加载器 BootStrap classloader 加载lib目录下的核心类库
  2. 扩展类加载器 Extension Classloader 加载 lib/ext 目录下的类
  3. 应用程序类加载器 Application ClassLoader 加载classpath 环境变量指定的类
  4. 自定义加载器: 自己实现,按需加载

双亲委派机制

类加载会委派自己的父类取首先加载一直到顶层,如果加载不到该类,则向下传递

全盘委托:当一个类加载器负责加载某个Class时,该Class所依赖的和引用的其他Class也将由该类加载器负责载入,除非显示使用另外一个类加载器来载入

缓存机制:缓存机制将会保证所有加载过的Class都会被缓存,当程序中需要使用某个Class时,类加载器先从缓存区寻找该Class。

双亲委派机制的好处,各个加载器各司其职,一个类不会被重复加载

什么时候破坏双亲委派机制, tomcat类加载

Tomcat 为什么要破坏双亲委派机制?

主要是为了解决类加载的灵活性和可定制性的需求。

Tomcat它允许部署和运行多个独立的Web应用程序,每个应用程序都有自己的类加载器。在传统的双亲委派机制下,所有的Web应用程序共享同一个父类加载器(通常是系统类加载器),这可能导致以下问题:

  1. 类冲突:由于所有Web应用程序共享同一个类加载器,如果不同的应用程序中存在相同包名和类名的类,会导致类冲突,无法正确加载和使用这些类。
  2. 动态更新:在运行时动态更新Web应用程序的某些类文件,由于双亲委派机制的限制,无法直接加载新的类定义,需要重启应用程序才能生效,影响应用的灵活性和可用性。(热部署的应用

为了解决上述问题,Tomcat引入了类加载器的分级机制,打破了双亲委派机制。在Tomcat中,每个Web应用程序都有自己的Web应用类加载器(WebAppClassLoader),它负责加载应用程序的类和资源。Web应用类加载器在加载类时会先检查自己是否已加载,如果未加载则尝试加载,而不委派给父加载器。

通过打破双亲委派机制,Tomcat能够实现以下优势:

  1. 隔离性:每个Web应用程序拥有独立的类加载器,可以隔离类加载的命名空间,避免类冲突问题。
  2. 动态更新:每个Web应用程序的类加载器可以独立加载和重新加载类定义,实现应用程序的热部署和动态更新。
  3. 可定制性:Tomcat的类加载器机制允许开发人员自定义类加载器,实现特定的类加载策略,满足应用程序的特殊求。
  • 21
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值