当前位置: 首页 > 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的朋友们提供一点帮助。


http://www.mrgr.cn/news/98369.html

相关文章:

  • 【动手学强化学习】番外7-MAPPO应用框架2学习与复现
  • AWS Redshift的使用场景及一些常见问题
  • 绿算轻舟系列FPGA加速卡:驱动数字化转型的核心动力
  • electron-builder参数详解
  • ukui-greeter编译与安装
  • C/C++的数据类型
  • 数据库原理及应用mysql版陈业斌实验三
  • mongodb 安装配置
  • AI 项目详细开发步骤指南
  • antv x6使用(支持节点排序、新增节点、编辑节点、删除节点、选中节点)
  • 【Java集合】HashMap源码深度分析
  • 大数据面试问答-批处理性能优化
  • poi-tl
  • Spark-SQL核心编程(一)
  • 【JavaEE初阶】多线程重点知识以及常考的面试题-多线程进阶(一)
  • Kubernetes Operator 是什么,以及它们的用途
  • 基于瑞芯微RK3576 国产ARM八核2.2GHz A72 NPU 6T AI——MQTT通信方案
  • #4 我们为什么使用物联网? 以及 物联网的整体结构
  • 优先级队列(堆二叉树)底层的实现:
  • Codeforces Round 1017 (Div. 4)题解