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

小结:jvm 类加载过程

在这里插入图片描述

类加载过程

是Java虚拟机(JVM)将字节码文件(.class文件)加载到内存中,并转换为运行时数据结构的过程。这个过程可以分为多个步骤,每个步骤都有其特定的任务和目的。根据你提供的信息,以下是类加载过程的三个主要步骤:

1. 加载

在这个阶段,类加载器通过一个类的全限定名来获取定义此类的二进制字节流。这一步骤包括以下几个子步骤:

  • 定位字节源:类加载器需要找到包含类定义的字节码文件。这些字节码文件可能存在于本地文件系统、网络资源、数据库或者其他任何形式的存储介质中。
  • 读取字节流:一旦找到了字节码文件,类加载器会读取该文件的内容,将其转化为字节流。
  • 创建类对象:类加载器使用读取到的字节流来创建一个java.lang.Class对象,这个对象代表了正在被加载的类。

2. 链接

链接阶段的主要任务是将字节流所代表的静态存储结构转化为方法区的运行时数据结构。这个阶段又可以细分为以下三个子阶段:

  • 验证:确保字节流中的信息符合Java虚拟机规范的要求,不会对虚拟机造成危害。验证包括字节码验证、符号引用验证等多个方面。
  • 准备:为类的静态变量分配内存,并设置默认初始值。例如,对于int类型的静态变量,默认值为0;对于引用类型,默认值为null。
  • 解析:将类的常量池内的符号引用替换为直接引用。符号引用是以字符串形式存在的,而直接引用可以直接指向目标。

3. 初始化

在这里插入图片描述

在初始化阶段,JVM会执行类构造器<clinit>()方法,这个方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块(static{}块,中的语句合并产生的。初始化阶段是执行类中定义的Java程序代码(或者说是字节码)的阶段,前面的类加载过程中,除了在加载阶段用户应用程序可以通过自定义类加载器参与之外,其余动作完全由JVM主导和控制。到了初始化阶段,才真正开始执行类中编写的Java程序代码(或者说是字节码)。

类加载类型

在这里插入图片描述

在这里插入图片描述

1. 类加载器类型

  • Bootstrap Class Loader
    由JVM内部实现(如C++),负责加载核心类库(如rt.jar)。它是所有类加载器的根基,但没有对应的Java对象,因此在代码中不可直接访问。
  • Extension Class Loader
    加载JRE扩展目录(如jre/lib/ext)中的类,父加载器为Bootstrap(但通常以null表示)。
  • System/Application Class Loader
    加载应用程序类路径(-classpath-cp)的类,父加载器是Extension。
  • User-Defined Class Loader
    用户自定义的类加载器(需继承ClassLoader类),可灵活指定其父加载器(默认父加载器是System)。

2. 包含关系

  • 不是继承关系:类加载器之间的层次通过组合实现(每个加载器持有父加载器的引用),而非类的继承。例如,ClassLoader类中有一个parent字段指向父加载器。
  • 委派模型:加载类时,子加载器会先委派父加载器尝试加载,父加载器失败后子加载器才自行加载。这种“双亲委派”机制确保了核心类的安全性。

3. **图示关系

Bootstrap Class Loader↑(隐含引用)
Extension Class Loader↑(parent字段引用)
System Class Loader↑(parent字段引用)
User-Defined Class Loader(可多个,各自独立)

Java类加载器之间的关系通过委派模型协作,形成逻辑上的层次结构,但并非通过类继承实现,而是通过对象间的引用组合(即包含关系)。具体如下:

// System Class Loader 的 parent 是 Extension Class Loader
ClassLoader systemLoader = ClassLoader.getSystemClassLoader();
ClassLoader parent = systemLoader.getParent(); // 父加载器是 Extension

4. Optional的说明

  • Optional可能指Java 9+模块化系统中的类加载器(如PlatformClassLoader),或特定场景下的可选加载器(如OSGi、Tomcat的WebApp类加载器)。它们与上述加载器协作,但遵循相同的委派逻辑。

总结

类加载器通过委派链形成包含关系,每个加载器通过parent字段引用父加载器,而非继承。这种设计保障了核心类库的隔离性与安全性,同时允许用户自定义类加载逻辑。

http://www.xdnf.cn/news/489187.html

相关文章:

  • 车道线检测----Lane-ATT
  • Linux自有服务
  • LLM学习笔记(四)信息论
  • 公路水运安全员B证主要考核内容有哪些
  • 中级统计师-统计学基础知识-第一章
  • C++ lambda表达式
  • 构建稳定的金字塔模式生态:从自然法则到系统工程
  • LVGL常见面试题
  • 腾讯云MCP数据智能处理:简化数据探索与分析的全流程指南
  • S32DS中定义的全局变量对应的路径查看${ProjDirPath}
  • ConcurrentSkipListMap的深入学习
  • 中国 MRO 的市场概况及发展趋势
  • LlamaIndex 第九篇 Indexing索引
  • C# RSA加密
  • No module named‘serial‘解决办法
  • 计算机视觉----感兴趣区域(ROI)、非极大值抑制
  • 日语简单记录
  • 物联网设备远程管理:基于代理IP的安全固件更新通道方案
  • 共有四个站进行码分多址CDMA通信。四个站的码片序列为......
  • 地磁传感器RM3100简单介绍
  • Socket echo server
  • APIfox参数化配置
  • 移动硬盘不显示容量?三步找回你的重要数据
  • BUFDS_GTE2,IBUFDS,BUFG缓冲的区别
  • 深度学习反向传播:从数学推导到实战解析
  • `ParameterizedType` 和 `TypeVariable` 的区别
  • C#实现访问远程硬盘(附源码)
  • 代码随想录 算法训练 Day3:链表1
  • X_T 转 STP 技术全解:从格式剖析到软件实操与迪威模型网在线转换指南
  • 数据标注的黄金标准:如何为机器学习构建可靠标签?