当前位置: 首页 > news >正文

Java类加载机制 双亲委派机制 八股速记版

JVM类加载机制是Java实现跨平台特性的核心机制之一,整个过程可分为以下五个阶段:

一、类加载流程

  1. 加载(Loading)
  • 通过全限定名获取二进制字节流
  • 将字节流转换为运行时数据结构
  • 生成对应的java.lang.Class对象
  1. 验证(Verification)
  • 文件格式验证(魔数、版本号)
  • 元数据验证(语义校验)
  • 字节码验证(数据流和控制流分析)
  • 符号引用验证(确保解析正确性)
  1. 准备(Preparation)
  • 为类变量分配内存
  • 设置初始零值(int=0,boolean=false等)
  • 常量值的直接赋值操作在此阶段完成
  1. 解析(Resolution)
  • 将常量池中的符号引用替换为直接引用
  • 涉及类/接口、字段、方法、方法类型的解析
  1. 初始化(Initialization)
  • 执行()方法
  • 父类初始化优先原则
  • 多线程环境下的同步控制

二、双亲委派机制详解

  1. 类加载器层级结构
    ├─ 启动类加载器(Bootstrap ClassLoader)
    │ └─ 加载JRE/lib目录核心类库
    ├─ 扩展类加载器(Extension ClassLoader)
    │ └─ 加载JRE/lib/ext目录扩展类
    ├─ 应用程序类加载器(Application ClassLoader)
    │ └─ 加载CLASSPATH指定内容
    └─ 自定义类加载器(开发者实现)
  2. 委派流程
    (1)收到类加载请求时先检查是否已加载
    (2)未加载则委托父加载器尝试加载
    (3)递归执行直到到达Bootstrap ClassLoader
    (4)父加载器无法完成时,子加载器才尝试加载
  3. 实现源码示例(简化版):
protected Class<?> loadClass(String name, boolean resolve) {
    synchronized (getClassLoadingLock(name)) {
        // 1. 检查是否已加载
        Class<?> c = findLoadedClass(name);
        if (c == null) {
            try {
                if (parent != null) {
                    // 2. 委派父加载器
                    c = parent.loadClass(name, false);
                } else {
                    // 3. 到达Bootstrap ClassLoader
                    c = findBootstrapClassOrNull(name);
                }
            } catch (ClassNotFoundException e) {}
            
            if (c == null) {
                // 4. 父加载器无法加载时执行findClass
                c = findClass(name);
            }
        }
        if (resolve) {
            resolveClass(c);
        }
        return c;
    }
}
  1. 核心优势
  • 避免重复加载:保证类在JVM中的唯一性
  • 安全防护:防止核心API被篡改(如自定义java.lang.String)
  • 层级隔离:不同加载器加载的类形成独立命名空间
  1. 突破双亲委派的典型场景
  • SPI机制(JDBC驱动加载)
  • OSGi模块化热部署
  • Web容器多应用隔离(如Tomcat)
  • 热代码替换(HotSwap)

三、类加载器关键特性

  1. 命名空间:不同类加载器加载的类互相不可见
  2. 卸载机制:类加载器实例被回收时才能卸载类
  3. 并行加载:支持并发类加载的类加载器(Java 7+)

双亲委派机制通过层级化加载体系,确保了Java核心类库的安全性和系统稳定性,同时通过破坏委派的灵活机制,为复杂场景提供了扩展可能性。理解这一机制对诊断类冲突、版本兼容等问题具有重要意义。

相关文章:

  • 网络配置的基本信息
  • MFC中CMutex类和CSingleLock类,配合使用疑惑
  • windows电脑上安装llama-factory实现大模型微调
  • 校园订餐微信小程序(全套)
  • CSS定位详解
  • 一键安装Mysql部署脚本之Linux在线安装Mysql,脚本化自动化执行服务器部署(附执行脚本下载)
  • 【Linux】进程退出 | 初始缓冲区 | 子进程回收(六)
  • PE文件结构详解(DOS头/NT头/节表/导入表)使用010 Editor手动解析notepad++.exe的PE结构
  • 泛微数智大脑Xiaoe.AI产品体验大会全国巡展,即将启航,诚邀现场体验
  • 【开源免费】基于SpringBoot+Vue.JS酒店管理系统(JAVA毕业设计)
  • 使用python运行网格世界环境下 TD算法
  • DeepSeek学习规划
  • 智能座舱介绍
  • 快速在本地运行SpringBoot项目的流程介绍
  • 智能称重搬物寻迹小车(论文+源码)
  • 虚拟机快照与linux的目录结构
  • MyBatis基础模块-日志模块
  • hive 面试题
  • Android Activity栈关系解析
  • 【朝夕教育】《鸿蒙原生应用开发从零基础到多实战》005-TypeScript 中的枚举
  • 4名中学生同服处方药后身体不适,一心堂一药店未凭处方售药被罚1万元
  • 完善劳动关系协商协调机制,《共同保障劳动者合法权益工作指引》发布
  • 广东高州发生山体滑坡,造成2人遇难4人送医救治1人失联
  • 15年全程免费,内蒙古准格尔旗实现幼儿园到高中0学费
  • 人民网:激发博物馆创新活力,让“过去”拥有“未来”
  • 经济日报金观平:促进信贷资金畅达小微企业