解析Java类加载的运行机制和双亲委派模型

类加载运行机制

类加载形如把.class文件,加载到内存中,得到类对象这样的过程

类加载一共分为五个步骤:

  1. 加载
  2. 验证
  3. 准备
  4. 解析
  5. 初始化

加载

类加载的第一步是将编译好的 Java 类的字节码文件加载到 Java 虚拟机(JVM)中。类加载器会根据类的名称找到对应的字节码文件,并将其读取到内存中。

验证

在验证阶段,虚拟机会对加载的字节码文件进行合法性验证,包括文件格式的验证、验证字节码的正确性和安全性等。这一步主要用于确保 class 文件不会引起虚拟机的错误或安全问题。

准备

在准备阶段,虚拟机会为加载的类分配内存空间,并设置类的默认初始值。这些初始值包括零值(0、false或null)或者用户所设置的初始值。

解析

解析阶段是将常量池中的符号引用转换成直接引用的过程。符号引用包括类、接口、字段和方法等的引用。解析操作的主要目的是为了创建对应的直接引用,以便于后续的内存空间分配、类的初始化和方法的调用等操作。

在 Java 语言中,当我们在代码中引用一个类、接口、字段或方法时,实际上是通过符号引用来表示的。符号引用是一种符号化的描述方式,它并不指向具体的内存地址或偏移量,而是通过符号的形式来描述所引用的目标。

举个例子,假设有以下代码片段:


public class ClassA {public void methodA() {ClassB b = new ClassB();b.methodB();}
}public class ClassB {public void methodB() {System.out.println("Method B is called");}
}

ClassAmethodA方法中,我们创建了一个ClassB的实例,并调用了它的methodB方法。

在解析阶段,虚拟机会进行如下的符号引用转换为直接引用的过程:

  1. 虚拟机会解析ClassAClassB的符号引用,找到对应的类ClassB的描述符和其他信息。
  2. 虚拟机会在内存中为ClassB分配空间,创建ClassB的实例对象。
  3. 虚拟机会将b变量与实际的内存地址关联起来,这样可以通过b来访问ClassB对象。
  4. 虚拟机会通过b.methodB()来调用ClassBmethodB方法,这里的methodB是一个直接引用。

所以,在解析阶段,虚拟机将符号引用转换为直接引用,这样就能够通过直接引用来访问和使用目标类的字段或方法。通过这种方式,虚拟机可以动态地解析和链接类之间的关系,实现类的动态绑定和调用。

初识化

在初始化阶段,虚拟机会执行类的初始化代码,例如静态变量的赋值和静态代码块的执行等。
这一阶段的触发条件包括:

  1. 类的实例被创建;
  2. 类的静态方法被调用;
  3. 类中的静态字段被赋值。

类的初始化是类加载的最后一个步骤。

双亲委派模型

双亲委派模型(又称为双亲委派机制)是Java类加载机制中的一种设计思想和实现方式
类加载机制是Java虚拟机(JVM)加载类的过程,而双亲委派模型是指在类加载过程中,JVM通过委派的方式来从不同的类加载器去加载类。这个机制主要用于确保类的一致性、安全性和避免重复加载。

在JVM中,有三个类加载器:

  • BootStrap ClassLoader 负责加载java标志库中的类
  • Extension ClassLoader 负责加载一些非标准的但是是Sun/Oracle 扩展的库的类
  • Application ClassLpader 负责加载项目中自己写的类以及第三方库中的一些类

在这里插入图片描述
一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最 终都应该传送到最顶层的启动类加载器中,只有当父加载器反馈自己无 法完成这个加载请求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去完成加载。

双亲委派模型基于以下几个原则:

  1. 父类加载器优先:如果一个类需要被加载,JVM首先会把这个任务委派给父类加载器来完成。
  2. 双亲委派:父类加载器在接收到加载请求后,会先检查自己是否已经加载了这个类。如果已经加载,则直接返回该类的Class对象。如果没有加载,则将加载请求向上委派给父类的父类加载器,以此类推,直到顶层的启动类加载器。只有当父类加载器不能完成加载任务时,子加载器才会尝试自己去加载
    3.** 缓存机制:如果一个类被某个加载器加载成功后,这个加载器会将加载结果缓存起来,下次再加载同样的类时直接返回缓存的结果**。

通过双亲委派模型,可以有效地避免类的重复加载和类的不一致性问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/21149.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里云:机器学习平台及OpenSearch

机器学习流程 相关项目 BladeDISC-AI编译优化 EasyRec-推荐算法库 EasyCV-视觉图像算法库 EasyNLP-NLP/多模态算法库 模型开发中算法团队面临的工程挑战 Develop platform OpenSearch 向量检索库

1.4 MVP矩阵

MVP矩阵代表什么 MVP矩阵分别是模型(Model)、观察(View)、投影(Projection)三个矩阵。 我们的顶点坐标起始于局部空间(Local Space),在这里他成为局部坐标(L…

【大语言模型】LLM应用程序的新兴体系结构

LLM应用程序的新兴体系结构 LLM应用栈设计模式:In-context learningData Preprocessing/EmbeddingPrompt Construction/RetrievalPrompt Execution/Inference What about agents?展望参考资料 大型语言模型是构建软件的强大新基元。但由于它们非常新颖且与常规计算…

J2EE集合框架Map

目录 一.Map特点 1.无序,键值对,键不能重复,值可以重复 2.键重复则覆盖,没有继承Collection接口 二.遍历方式 1.拿到key,再拿值2.拿到映射关系,键值都有 取出保存所有Entry的Set,再遍历此Set即可 三.HashMap与H…

【数据结构】树与二叉树(上)

目录 前言: 一、树: 1.树的概念: 2.树的相关概念: 3.树的表示: 4.书的实际使用场景: 二、二叉树: 1.二叉树的概念: 2.两种特殊二叉树: ①.满二叉树:…

C++图形开发(16):绘制一个圆环和一根针

文章目录 绘制一个圆环和一根针1.1 绘制1.2 line()函数1.3 circle()函数1.4 setlinestyle()函数1.5 setlinecolor()函数 接下来,我会继续制作一些小游戏,但因为整个难度的上升(毕竟我也是初学者),可能文章不会再像之前…

Can转RTU网关can总线转以太网设备

YC-CAN-RTU 是一款用于 CAN-Modbus 现场总线与 RS-232 总线或 RS-485 总线之间数据转换的协议型转换器,支持标准 Modbus RTU 协议。集成 1 路RS-232 通道、1 路RS-485 通道、1 路CAN-Modbus 通道,可以方便地嵌入使用 RS-232 接口和 RS-485 接口的节点上&…

openGauss学习笔记-08 openGauss 数据类型

文章目录 openGauss学习笔记-08 openGauss 数据类型8.1 数值类型8.2 布尔类型8.3 字符类型8.4 二进制类型8.5 日期/时间类型8.6 几何类型8.7 网络地址类型8.8 位串类型8.9 文本搜索类型8.10 UUID数据类型8.11 JSON/JSONB类型8.12 HLL数据类型8.13 范围类型8.14 索引8.15 对象标…

基于 OpenCV 的图像处理与分析应用的设计与实现

基于 OpenCV 的图像处理与分析应用的设计与实现 导语一、应用设计概述二、应用实现步骤三、应用示例:图像滤波与边缘检测总结 导语 图像处理与分析是计算机视觉中的重要应用领域,通过对图像进行处理和分析,可以提取有用的信息和特征&#xf…

微信小程序监听页面跳转API

// 放在app.js 里面的onshow生命周期里面wx.onAppRoute((res) > {console.log(路由跳转,res})})

《Python机器学习:基于PyTorch和Scikit-Learn》——AIC松鼠活动第三期

内容简介 本书是一本全面介绍在PyTorch环境下学习机器学习和深度学习的综合指南,可以作为初学者的入门教程,也可以作为读者开发机器学习项目时的参考书。 本书讲解清晰、示例生动,深入介绍了机器学习方法的基础知识,不仅提供了构…

通过python的signal库模拟电源设备的csine波形

import numpy as np import matplotlib.pyplot as plt import random from scipy import signal def csin(length, amp,lenf,n):"""生成模拟CSIN波形的函数:param length: 波形长度:param amp: 波形振幅:return: CSIN波形数据"""amp 100 if (am…