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

server/2025/3/3 18:41:58/

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 ClassLoaderc = findBootstrapClassOrNull(name);}} catch (ClassNotFoundException e) {}if (c == null) {// 4. 父加载器无法加载时执行findClassc = 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核心类库的安全性和系统稳定性,同时通过破坏委派的灵活机制,为复杂场景提供了扩展可能性。理解这一机制对诊断类冲突、版本兼容等问题具有重要意义。


http://www.ppmy.cn/server/172139.html

相关文章

全面解析:如何查找电脑的局域网与公网IP地址‌

在数字化时代&#xff0c;IP地址作为网络设备的唯一标识&#xff0c;对于网络连接、远程访问、网络诊断等方面都至关重要。无论是出于工作需要&#xff0c;还是解决网络问题&#xff0c;了解怎么查找电脑的IP地址都是一项必备技能。本文将详细介绍几种常见的方法&#xff0c;帮…

【网络安全 | 扫描子域+发现真实IP】CloakQuest3r安装使用详细教程

原创文章,禁止转载。 本文仅作学习交流使用,不得用于非法渗透,笔者不承担任何责任。 文章目录 简介功能介绍执行流程限制安装步骤可选功能:SecurityTrails API使用示例简介 CloakQuest3r 是一款强大的 Python 工具,专为揭示受 Cloudflare 及类似服务保护的网站真实 IP 地…

前端面试题---小程序跟vue的声明周期的区别

1. 小程序生命周期 小程序的生命周期主要分为 页面生命周期 和 应用生命周期。每个页面和应用都有自己独立的生命周期函数。 应用生命周期 小程序的应用生命周期函数与全局应用相关&#xff0c;通常包括以下几个钩子&#xff1a; onLaunch(options)&#xff1a;应用初始化时触…

DeepSeek MLA(Multi-Head Latent Attention)算法浅析

目录 前言1. 从MHA、MQA、GQA到MLA1.1 MHA1.2 瓶颈1.3 MQA1.4 GQA1.5 MLA1.5.1 Part 11.5.2 Part 21.5.3 Part 3 结语参考 前言 学习 DeepSeek 中的 MLA 模块&#xff0c;究极缝合怪&#xff0c;东抄抄西抄抄&#xff0c;主要 copy 自苏神的文章&#xff0c;仅供自己参考&#…

绕过信息过滤与注入限制

绕过 information_schema 过滤 information_schema 是 MySQL 中存储元数据的系统数据库&#xff0c;常用于 SQL 注入中获取表名、列名等信息。当 information_schema 被过滤时&#xff0c;可以通过以下方法绕过。 1 替代视图 使用 sys 库&#xff08;MySQL 5.7&#xff09; …

第8天:面向对象编程入门 - 类与对象

第8天&#xff1a;面向对象编程入门 - 类与对象 一、&#x1f4da; 今日学习目标 &#x1f3af; 掌握类与对象的定义与使用&#x1f527; 理解封装、继承、多态三大特性&#x1f4a1; 完成银行账户管理系统实战&#x1f6e0;️ 学会构造函数与析构函数的编写 二、⚙️ 核心知…

微前端架构深度解析:从组合式应用到模块联邦

引言&#xff1a;万亿级流量的前端架构革命 Amazon将主站迁移至微前端架构后&#xff0c;独立模块发布速度提升800%&#xff0c;日均部署次数突破1500次。阿里巴巴采用qiankun框架重构跨BU应用&#xff0c;首屏加载性能提升320%&#xff0c;资源复用率达92%。Salesforce通过Mo…

JavaScript 输入输出语句

在JavaScript中&#xff0c;输入和输出是与用户进行直接互动的关键方式。通过输入&#xff0c;我们可以从用户那里获取信息&#xff1b;通过输出&#xff0c;我们能向用户展示处理结果或其他重要信息。本文将详细介绍几种常见的JavaScript输入输出方法及其应用场景。 输出语句…