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

30学Java第十天——类加载的过程

类加载过程

在这里插入图片描述

在Java中,类加载的过程主要包括以下三个阶段:

  • 加载(Loading): 从文件系统或网络中加载字节码到JVM中。
  • 链接(Linking): 将字节码的二进制数据合并到JVM中,包括验证、准备和解析。
  • 初始化(Initialization): 执行类的静态初始化代码,如静态变量的赋值和静态代码块的执行。
  1. 加载(Loading)
    类加载的第一步是加载。JVM通过类加载器将类的字节码从文件系统(如JAR文件或.class文件)中读取到JVM中。在这一阶段,JVM会创建一个代表这个类的 Class 对象。

    如何加载:

    • JVM查找需要加载的类的二进制字节码。
    • 如果字节码存在,就将其加载到内存中。
    • 如果类已经加载过,则避免重复加载。
  2. 链接(Linking)
    链接是将加载的类数据合并到JVM中的过程,主要包括以下三个子步骤:

  • 验证(Verification):
    确保加载的类的字节码符合Java语言的语法和结构规则。
    检查字节码文件的正确性,确保安全性。

  • 准备(Preparation):
    为类的静态变量分配内存并设置默认值。
    在这个阶段,类的静态变量被分配内存,但仅被初始化为默认值(例如整型默认值为0,引用类型为null)。

  • 解析(Resolution):
    将类中的符号引用转换为直接引用。符号引用是指向其他类、字段或方法的字符串表示,而直接引用则是直接指向内存地址。
    解析是在程序执行前完成的,避免了运行时的复杂解析。

  1. 初始化(Initialization)
    这是类加载过程中最重要的一步。在这个阶段,JVM会执行类的静态初始化代码,包括:
    • 调用静态变量的赋值语句。
    • 运行静态代码块。

类加载器(ClassLoader)

Java中的类加载器负责加载类。JVM的类加载器分为以下几种:

  • 启动类加载器(Bootstrap ClassLoader):

    • 负责加载JDK的核心类库,如 java.lang、java.util 等。
    • 是C++实现的,无法直接在Java中访问。
  • 扩展类加载器(Extension ClassLoader):

    • 负责加载JDK的扩展类库。
    • 通常指 jre/lib/ext 或通过 java.ext.dirs 指定的路径中类。
  • 应用程序类加载器(Application ClassLoader):

    • 负责加载用户类,即用户的应用程序类。
    • 通常是从classpath中查找类。
  • 自定义类加载器:

    • 开发者可以通过继承 java.lang.ClassLoader 创建自定义类加载器,以实现特定的类加载策略。

可以通过getPrent() 方法一级一级获取类加载器,等级按照下图。
在这里插入图片描述

类加载的优先级

类加载器在加载类时会遵循一定的优先顺序,这在解决类的重复加载和类的隔离方面非常重要。大致顺序如下:
启动类加载器 ==》扩展类加载器 ==》应用程序类加载器 ==》自定义类加载器

双亲委派机制

  • 某个类加载接收到加载类的任务时,通常会委托给其 “父” 类加载器 完成加载
  • 最“父” 类加载器 无法加载时,会一级一级向下委托加载任务
  • 作用:
    • 保护程序安全
    • 防止类重复加载
      在这里插入图片描述

注:本文章源于学习动力节点老杜的java教程视频后的笔记整理,方便自己复习的同时,也希望能给csdn的朋友们提供一点帮助。

相关文章:

  • **searchProperties 是什么,python中**是什么:解包字典的操作符
  • camx的xml解析
  • 【跳坑日记】Jetson 6.2 编译cuda-sample报错:No CMAKE_CUDA_COMPILER could be found
  • java android持久化数据
  • c#内存泄露的原因和解决办法
  • 全新电脑如何快速安装nvm,npm,pnpm
  • 批量将文件夹名称、文件夹路径提取到 Excel 清单
  • git在IDEA中使用技巧
  • RabbitMQ消息的可靠性
  • 腾讯云golang一面
  • Project ERROR: liblightdm-qt5-3 development package not found问题的解决方法
  • 基于 Python 和 OpenCV 技术的疲劳驾驶检测系统(2.0 全新升级,附源码)
  • 双向链表中间插入节点,删除节点
  • Trae CN 使用入门指南
  • 【uniapp-兼容性处理】swiper在iOS上偶发出现后几张图片白屏情况
  • Vue使用axios实现:上传文件、下载文件
  • .NET Core DI(依赖注入)的生命周期及应用场景
  • React 更新state中的对象
  • Doris 中 Compaction 问题的深度剖析与解决方案
  • linux编译adbd工具使用
  • 瑞士联邦主席凯勒-祖特尔、联邦副主席帕姆兰会见何立峰
  • 中美经贸高层会谈将在午餐后继续
  • 总粉丝破亿!当网络大V遇见硬核科技,互联网时代如何书写上海故事?
  • 19个剧团15台演出,上海民营院团尝试文旅融合新探索
  • 构建菌株有效降解有机污染物,上海交大科研成果登上《自然》
  • 纽约大学朗格尼医学中心的转型带来哪些启示?