首页 > 其他分享 >类加载机制

类加载机制

时间:2024-08-07 14:17:31浏览次数:5  
标签:文件 Java ClassLoader 引用 机制 class 加载

什么是类加载机制

我们编写的 Java 文件都是以.java 为后缀的文件,编译器会将我们编写的.java 的文件编译成.class 文件,简单来说类加载机制就是jvm从文件系统将一系列的 class 文件z转化为二进制流加载 JVM 内存中并生成一个该类的Class对象,为后续程序运行提供资源的动作。

整体的流程图

image-20240807141542940

各个阶段的解析

(1):加载
a:加载的类的字节码文件以及二进制文件的来源
通过一个类的完整路径查找此类字节码文件(class 文件即二进制文件)。将二进制文件的静态存储结构转化为方法区的运行时数据结构,并利用二进制流文件创建一个Class对象,存储在 Java 堆中用于对方法区的数据结构引用的入口;
class 文件的来源:有一点需要注意的是类加载机制不仅可以从文件系统读取 class 文件,也可以通过网络获取,其他 jar 包或者其他程序生成,如 JSP 应用。

b:类加载器
类加载器:讲到类加载不得不讲到类加载的顺序和类加载器。Java 中大概有四种类加载器,分别是:启动类加载器(Bootstrap ClassLoader),扩展类加载器(Extension ClassLoader),系统类加载器(System ClassLoader),自定义类加载器(Custom ClassLoader),依次属于继承关系(注意这里的继承不是 Java 类里面的 extends)
启动类加载器(Bootstrap ClassLoader):主要负责加载存放在Java_Home/jre/lib下,或被-Xbootclasspath参数指定的路径下的,并且能被虚拟机识别的类库(如rt.jar,所有的java.*开头的类均被Bootstrap ClassLoader加载),启动类加载器是无法被Java程序直接引用的。

扩展类加载器(Extension ClassLoader):主要负责加载器由sun.misc.Launcher$ExtClassLoader实现,它负责加载Java_Home/jre/lib/ext目录中,或者由java.ext.dirs系统变量指定的路径中的所有类库(如javax.*开头的类),开发者可以直接使用扩展类加载器。

系统类加载器(System ClassLoader):主要负责加载器由sun.misc.Launcher$AppClassLoader来实现,它负责加载用户类路径(ClassPath)所指定的类,开发者可以直接使用该类加载器,如果应用程序中没有自定义过自己的类加载器,一般情况下这个就是程序中默认的类加载器。

自定义类加载器(Custom ClassLoader:自己开发的类加载器

c:双亲委派
如果一个类加载器需要加载类,那么首先它会把这个类加载请求委派给父类加载器去完成,如果父类还有父类则接着委托,每一层都是如此。
一直递归到顶层,当父加载器无法完成这个请求时,子类才会尝试去加载。
image-20240807141640905

(2):验证
验证的过程只要是保证 class 文件的安全性和正确性,确保加载了该 class 文件不会导致 JVM 出现任何异常,不会危害JVM 的自身安全。验证包括对文件格式的验证,元数据和字节码的验证。

(3):准备
准备阶段是为类变量进行内存分配和初始化零值的过程。注意这时候分配的是类变量的内存,这些内存会在方法区中分配。此时不会分配实例变量的内存,因为实例变量是在实例化对象时一起创建在Java 堆中的。而且此时类变量是赋值为零值,即 int 类型的初值为 0,引用类型初值为 null,而不是代码中显示赋值的数值。

(4):解析
将常量池的符号引用转化成直接引用。符号引用可以理解为只是个替代的标签,比如你此时要做一个计划,暂时还没有人选,你设定了个 A 去做这个事。然后等计划真的要落地的时候肯定要找到确定的人选,到时候就是小明去做一件事。
解析就是把 A(符号引用) 替换成小明(直接引用)。符号引用就是一个字面量,没有什么实质性的意义,只是一个代表。直接引用指的是一个真实引用,在内存中可以通过这个引用查找到目标。

(5):初始化
初始化的阶段是类加载的最后一步,这个阶段主要是执行 java 代码,进行相关初始化的动作;这时候就执行一些静态代码块,为静态变量赋值,这里的赋值才是代码里面的赋值,准备阶段只是设置初始值占个坑。

标签:文件,Java,ClassLoader,引用,机制,class,加载
From: https://www.cnblogs.com/N1cholas210162702016/p/18346952

相关文章

  • YoloV9改进策略:注意力机制改进|通过iAFF模块优化RepNBottleneck结构,YoloV9性能飞跃|即
    摘要在深度学习和计算机视觉领域,YoloV9以其卓越的目标检测性能赢得了广泛的关注与应用。为了进一步提升YoloV9的识别精度和鲁棒性,我们创新性地在其核心组件——RepNBottleneck模块中引入了迭代注意力特征融合(iAFF)模块。这一改进不仅实现了显著的涨点效果,还展现了在复杂场景......
  • YoloV8改进策略:注意力机制改进|全局与局部注意力融合(AFF)|即插即用
    摘要在深度学习和计算机视觉领域,YoloV8以其卓越的性能和实时检测能力而广受赞誉。为了进一步提升YoloV8的检测精度和泛化能力,我们创新性地在其核心Bottleneck模块中引入了注意力特征融合(AFF)机制。这一改进不仅实现了即插即用的便捷性,还显著提升了模型的表现,为YoloV8注入了......
  • 2024最新Mysql锁机制与优化实践以及MVCC底层原理剖析
    锁机制详解锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除了传统的计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供需要用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一......
  • 学懂C++(七): C++错误处理机制 -- 异常
    目录前言一、C语言传统的处理错误的方式二、C++异常的概念三、异常的使用3.1异常的抛出和匹配原则3.2在函数调用链中异常栈展开匹配原则3.3异常的重新抛出3.4异常规范四、自定义异常体系五、异常的优缺点优点缺点结论前言        C++提供了一......
  • SpringBoot - SPI机制
    SpringBoot-SPI机制  概要  什么是SPI呢,全称是ServiceProviderInterface。简单翻译的话,就是服务提供者接口,是一种寻找服务实现的机制。这个是针对厂商或者插件的。  其实就是一个规范定义、或者说是实现的标准。  一、SPI思想  SPI的思想:系统里抽象......
  • Vue3中滚动加载更多数据
    <divclass="my-task-body-inner"ref="scrollContainer"@scroll="handleScroll"style="height:100%;overflow-y:auto;"></div>constscrollContainer=ref(null); consthandleScroll=()=>......
  • SQL Server数据库的清洁工:垃圾回收机制解析
    SQLServer数据库的清洁工:垃圾回收机制解析在SQLServer的复杂而精密的数据库管理系统中,垃圾回收机制扮演着至关重要的角色。它负责清理不再需要的数据,释放空间供新数据使用。本文将深入探讨SQLServer中数据库垃圾回收机制的工作原理,并提供代码示例,帮助你更好地理解这一自......
  • 编程深水区之并发②:JS的单线程事件循环机制
    如果某天有人问你,Node.js是单线程还是多线程,你如何回答?一、单线程并发原理我们以处理Web请求为例,来看看Node在处理并发请求时,究竟发生了什么。Node启动Web服务器后,创建主线程(只有一个)。当有一个阻塞请求过来时,主线程不会发生阻塞,而是继续处理其它代码或请求。如果阻塞......
  • 多头自注意力机制计算举例
    多头自注意力机制计算示例多头自注意力机制计算示例1.输入序列和权重矩阵假设输入序列X如下:X[1,0,1,0][0,1,0,1][1,1,1,1]我们有两个头,分别对应的权重矩阵如下:头1WQ(1)WK(1)WV(1)[1,0][1,0][1,0][0,1][0,1][0,1][1,0][1,......
  • 自注意力机制最简单的示例
    自注意力机制示例自注意力机制示例1.输入序列假设我们有一个简单的输入序列,包含三个词(向量表示),每个词的维度是4: x1x2x3x4词11010词20101词311112.查询(Q)、键(K)和值(V)矩阵我们定义查询、键和值的权重矩阵如下: QKV权重矩阵......