Plantre Plantre
首页
后端
技术
硬件
  • 前端文章

    • HTML
    • CSS
    • JavaScript
  • 技术

    • 技术文档
    • GitHub技巧
    • Nodejs
    • 博客搭建
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

plantre

一个后端开发者
首页
后端
技术
硬件
  • 前端文章

    • HTML
    • CSS
    • JavaScript
  • 技术

    • 技术文档
    • GitHub技巧
    • Nodejs
    • 博客搭建
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 计算机组成原理

  • 操作系统

  • 计算机网络

  • 设计模式

  • Java

    • Java基础

    • Java集合

    • Java并发

    • JVM

      • JVM内存模型
      • JVM垃圾回收中的道法术器
      • Minor GC,Major GC,Young GC,Old GC,Major GC有什么区别
      • Minor GC时老年代在干什么
      • ​​Major GC时年轻代在干什么
      • Full GC​时年轻代和老年代在干什么
      • 常用垃圾回收器对比
      • OOM、内存泄漏与内存溢出的区别解析
      • 类的加载机制
  • Spring

  • SpringCloud

  • MySQL

  • Redis

  • 分布式

  • Zookeeper

  • Dubbo

  • Kafka

  • 数据结构

  • 算法

  • OJ

  • 从道家哲学看计算机?
  • 后端
  • Java
  • JVM
plantre
2025-05-08

类的加载机制

类的加载机制详解

一、类加载的核心流程 类的加载机制是Java虚拟机(JVM)将字节码文件(.class)动态加载到内存并转换为可执行类的过程,其核心流程分为以下五个阶段:

  1. 加载(Loading)
    • 任务:通过类加载器查找.class文件,读取二进制数据到内存,并在方法区生成类的Class对象作为访问入口。

    • 数据来源:可从本地文件、网络、动态代理生成(如Spring AOP)或JSP编译结果获取。

  2. 验证(Verification)
    • 目的:确保字节码合法且不危害JVM安全。

    • 步骤:

    ◦ 文件格式验证:检查魔数、版本号等是否符合规范。

    ◦ 语义验证:验证继承关系、方法重写等是否符合Java语法规则。

    ◦ 字节码验证:分析指令逻辑,防止非法操作(如栈溢出)。

  3. 准备(Preparation)
    • 任务:为静态变量分配内存并设置默认初始值(如int初始化为0,对象初始化为null)。

    • 注意:显式赋值(如static int a=5)在初始化阶段完成,但被final static修饰的常量会在此时直接赋值。

  4. 解析(Resolution)
    • 任务:将符号引用(如类名、方法名)转换为直接引用(内存地址或指针)。

    • 示例:java.lang.String的符号引用被解析为方法区中的实际地址。

  5. 初始化(Initialization)
    • 触发条件:首次访问类的静态变量、静态方法或通过new创建对象时。

    • 操作:执行静态代码块(static{})和显式静态变量赋值,且父类的初始化优先于子类。


二、类加载器与双亲委派模型

  1. 类加载器层次结构
    • 启动类加载器(Bootstrap ClassLoader):由C++实现,加载JAVA_HOME/lib下的核心类库(如java.lang.*)。

    • 扩展类加载器(Extension ClassLoader):加载JAVA_HOME/lib/ext目录或java.ext.dirs指定的扩展类(如javax.*)。

    • 应用类加载器(Application ClassLoader):加载用户类路径(ClassPath)的类,是默认的系统类加载器。

  2. 双亲委派模型
    • 工作原理:类加载器收到请求后,先委托父加载器处理,仅在父加载器无法完成时自行加载。

    • 优点:

    ◦ 安全性:避免用户自定义类覆盖核心类(如java.lang.String)。

    ◦ 唯一性:确保核心类库仅加载一次,避免内存浪费。

  3. 打破双亲委派的场景
    • Tomcat类隔离:每个Web应用使用独立类加载器,防止不同应用的类冲突。

    • SPI机制:JDBC驱动加载需由启动类加载器委托线程上下文类加载器加载实现类。


三、自定义类加载器的应用场景

  1. 热部署:动态替换已加载类(如Spring DevTools),无需重启应用。
  2. 插件化开发:隔离插件类以避免依赖冲突(如Eclipse插件机制)。
  3. 多版本共存:同时加载不同版本的类(如电商项目中新旧API兼容)。
  4. 加密保护:加载加密的.class文件,防止反编译。
  5. 非标准类加载:从数据库或网络流加载类(如动态生成代码)。

四、类加载的触发时机与内存管理

  1. 触发时机
    • 显式触发:Class.forName()、ClassLoader.loadClass()。

    • 隐式触发:创建对象实例、访问静态变量/方法、反射调用。

  2. 内存优化
    • 验证阶段跳过:通过-Xverify:none参数关闭部分验证,减少加载时间。

    • 分代收集算法:新生代使用复制算法(高频回收),老年代使用标记-整理算法(减少碎片)。


五、总结与扩展 类的加载机制通过双亲委派模型保障核心类安全,通过多阶段验证确保代码合法性,并通过自定义类加载器支持灵活扩展。实际开发中需注意: • 性能调优:监控GC日志,调整堆大小(-Xmx)或选择低延迟收集器(如ZGC)。

• 安全性:避免类重复加载导致ClassCastException,防范恶意代码注入。

理解类加载机制不仅是面试高频考点(如双亲委派、类初始化顺序),更是优化应用性能和设计高扩展架构的关键。

编辑 (opens new window)
上次更新: 2025/06/10, 09:18:05
OOM、内存泄漏与内存溢出的区别解析
Spring 事务

← OOM、内存泄漏与内存溢出的区别解析 Spring 事务→

最近更新
01
集成loki
07-04
02
TCP的ESTABLISHED是什么意思
06-24
03
安装1panel
06-24
更多文章>
Theme by Vdoing | Copyright © 2025-2025 plantre | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式