【Jvm】Java类加载机制是什么?

news2024/9/29 9:39:04

文章目录

  • 一、目标:
  • 二、原理 (类的加载过程及其最终产品)
  • 三、过程(类的生命周期)
    • 3.1、加载
    • 3.2、校验
    • 3.3、准备
    • 3.4、解析
    • 3.5、初始化
  • 四、类加载器
  • 五、双亲委派机制

一、目标:

  1. 什么是类的加载?
  2. 类的生命周期?
  3. 类加载器是什么?
  4. 双亲委派机制是什么?

二、原理 (类的加载过程及其最终产品)

JVM将class文件字节码文件加载到内存中, 并将这些静态数据转换成方法区中的运行时数据结构,在堆(并不一定在堆中,HotSpot在方法区中)中生成一个代表这个类的java.lang.Class 对象,作为方法区类数据的访问入口。

三、过程(类的生命周期)

JVM类加载机制分为五个部分:加载,验证,准备,解析,初始化,下面我们就分别来看一下这五个过程。其中加载、检验、准备、初始化和卸载这个五个阶段的顺序是固定的,而解析则未必。为了支持动态绑定,解析这个过程可以发生在初始化阶段之后。
在这里插入图片描述

3.1、加载

加载过程主要完成三件事情:

  1. 通过类的全限定名来获取定义此类的二进制字节流
  2. 将这个类字节流代表的静态存储结构转为方法区的运行时数据结构
  3. 在堆中生成一个代表此类的java.lang.Class对象,作为访问方法区这些数据结构的入口。

这个过程主要就是类加载器完成。

3.2、校验

此阶段主要确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机的自身安全。

  1. 文件格式验证:基于字节流验证。
  2. 元数据验证:基于方法区的存储结构验证。
  3. 字节码验证:基于方法区的存储结构验证。
  4. 符号引用验证:基于方法区的存储结构验证。

3.3、准备

为类变量分配内存,并将其初始化为默认值。(此时为默认值,在初始化的时候才会给变量赋值)即在方法区中分配这些变量所使用的内存空间。例如:

public static int value = 123;

此时在准备阶段过后的初始值为0而不是123;将value赋值为123的putstatic指令是程序被编译后,存放于类构造器方法之中.特例:

public static final int value = 123;

此时value的值在准备阶段过后就是123。

3.4、解析

把类型中的符号引用转换为直接引用。

  • 符号引用与虚拟机实现的布局无关,引用的目标并不一定要已经加载到内存中。各种虚拟机实现的内存布局可以各不相同,但是它们能接受的符号引用必须是一致的,因为符号引用的字面量形式明确定义在Java虚拟机规范的Class文件格式中。
  • 直接引用可以是指向目标的指针,相对偏移量或是一个能间接定位到目标的句柄。如果有了直接引用,那引用的目标必定已经在内存中存在
    主要有以下四种:
  1. 类或接口的解析
  2. 字段解析
  3. 类方法解析
  4. 接口方法解析

3.5、初始化

初始化阶段是执行类构造器方法的过程。方法是由编译器自动收集类中的类变量的赋值操作和静态语句块中的语句合并而成的。虚拟机会保证方法执行之前,父类的方法已经执行完毕。如果一个类中没有对静态变量赋值也没有静态语句块,那么编译器可以不为这个类生成<client>()方法。

java中,对于初始化阶段,有且只有以下五种情况才会对要求类立刻“初始化”(加载,验证,准备,自然需要在此之前开始):

  1. 使用new关键字实例化对象、访问或者设置一个类的静态字段(被final修饰、编译器优化时已经放入常量池的例外)、调用类方法,都会初始化该静态字段或者静态方法所在的类。
  2. 初始化类的时候,如果其父类没有被初始化过,则要先触发其父类初始化。
  3. 使用java.lang.reflect包的方法进行反射调用的时候,如果类没有被初始化,则要先初始化。
  4. 虚拟机启动时,用户会先初始化要执行的主类(含有main)
  5. jdk 1.7后,如果java.lang.invoke.MethodHandle的实例最后对应的解析结果是 REF_getStatic、REF_putStatic、REF_invokeStatic方法句柄,并且这个方法所在类没有初始化,则先初始化。

四、类加载器

把类加载阶段的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作交给虚拟机之外的类加载器来完成。这样的好处在于,我们可以自行实现类加载器来加载其他格式的类,只要是二进制字节流就行,这就大大增强了加载器灵活性。系统自带的类加载器分为三种:

  1. 启动类加载器。
  2. 扩展类加载器。
  3. 应用程序类加载器。

五、双亲委派机制

在这里插入图片描述

双亲委派机制工作过程:

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

双亲委派模型的优点:java类随着它的加载器一起具备了一种带有优先级的层次关系.

例如类java.lang.Object,它存放在rt.jart之中.无论哪一个类加载器都要加载这个类.最终都是双亲委派模型最顶端的Bootstrap类加载器去加载.因此Object类在程序的各种类加载器环境中都是同一个类.相反.如果没有使用双亲委派模型.由各个类加载器自行去加载的话.如果用户编写了一个称“java.lang.Object”的类.并存放在程序的ClassPath中.那系统中将会出现多个不同的Object类.java类型体系中最基础的行为也就无法保证.应用程序也将会一片混乱.

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue3.x+elementPlus+swiper+vuedraggable实现页面装修

前言 该实现代码依赖框架&#xff1a;vue3.xelementPlusswipervuedraggable&#xff0c;做好前期工作&#xff0c;可直接在下面的附件处点击下载链接来下载相关文件&#xff1b;文件中包括搜索/图文广告/滚动消息三个模块代码示例&#xff0c;其他组件实现思路相同&#xff0c…

APT 系列 (一):APT 筑基之反射

什么是反射&#xff1f; 简单来讲&#xff0c;反射就是&#xff1a;已知一个类&#xff0c;可以获取这个类的所有信息 一般情况下&#xff0c;根据面向对象封装原则&#xff0c;Java实体类的属性都是私有的&#xff0c;我们不能获取类中的属性。但我们可以根据反射&#xff0…

问题解决 |关于CUDA的代码错误总结以及解决方法

本博客主要关于常见的CUDA的代码错误总结以及解决方法~ 1.RuntimeError运行错误 1.1.RuntimeError: CUDA error: out of memory CUDA kernel errors might be asynchronously reported at some other API call,so the stacktrace below might be incorrect. For debugging cons…

Day09 Python面向对象和异常详解

文章目录 第六章 Python面向对象6.1. 面向对象基础6.1.1. 面向对象与面向过程6.1.2. 类与对象6.1.3. 类的设计与对象的实例化6.1.4. 构造方法6.1.5. 魔术方法6.1.6. 类与类的关系使用到另一个类的对象完成需求使用到另一个类的对象作为属性 6.2. 面向对象进阶6.2.1. 封装6.2.1.…

开启AI原型设计新时代:数字创意的崭新前景

随着人工智能生成内容&#xff08;AIGC&#xff09;相关研究的突破&#xff0c;人类社会正面临一个全新的转折点。诸如多模态、可控扩散模型和大型语言模型等技术正在直接改变创意设计领域的生产过程。 在AIGC领域中&#xff0c;根据输入内容和输出形式的差异&#xff0c;我们…

【MySQl】索引及其B+树

目录 一、索引初识和测试数据的构建 二、磁盘 三、MySQL、OS、磁盘的交互方式&#xff08;InnoDB 存储引擎&#xff09; 四、MySQL中索引和page的理解 1、为什么MySQL和磁盘进行IO交互的时候&#xff0c;要采用page的方案进行交互&#xff0c;而不是采用用多少&#xff0c…

O2O跑腿快递可以解决哪些问题?

各大电商巨头都已经布局了O2O快递&#xff0c;就目前国内的快递环境而言&#xff0c;基本已经形成了四通一达局面&#xff0c;那么O2O同城配送目前有何痛点呢?下面小编就来为大家分析分析&#xff0c;感兴趣的朋友快来一起了解了解吧! 一、O2O快递目前存在哪些痛点? 我们国…

力扣题库刷题笔记14--最长公共前缀

1、题目如下&#xff1a; 2、个人Python代码实现 首先讲一下思路&#xff0c;通俗的来讲&#xff0c;就是依次比较字符串里面所有的字符&#xff0c;如果相同就是公共前缀&#xff0c;如果不同&#xff0c;后面就不用比较了&#xff0c;所以主要就是以下几点&#xff1a; 1、外…

[Leetcode] 0026. 删除有序数组中的重复项

26. 删除有序数组中的重复项 点击上方&#xff0c;跳转至Leetcode 题目描述 给你一个 升序排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。 由于在某些语…

好用到爆的数据库软件,还能兼容Excel,可以抛弃“VF”和Access

现在大部人已经不再用VF “VF”这个缩写&#xff0c;也只是停留在那个时代里&#xff0c;很多人已经不知道原来的样子&#xff0c;但有的人却还感慨万千。 懂得人自然都懂&#xff01; 微软的两款数据库软件&#xff1a;一个是office的Access&#xff0c;另一个就是“VF” VF…

自定义数据类型:结构体,枚举,联合

之前我们已经了解过结构体&#xff0c;这篇文章再来深入学习的一下&#xff0c;然后再学习其他自定义数据类型&#xff0c;枚举和联合 目录 1.结构体 1.1 结构体类型的声明 1.2 结构体的自引用 1.3 结构体变量的定义和初始化 1.4 结构体内存对齐 1.5 结构体传参 1.6 结…

【Shermo学习】使用shermo批量读入ORCA频率计算结果文件,并批量输出热力学校正数据

使用shermo批量读入ORCA频率计算结果文件&#xff0c;并批量输出热力学校正数据 安装与运行简单任务示例批量输出热力学校正数据 Shermo是北京科音自然科学研究中心卢天老师开发的一个程序&#xff0c;可以用来处理量子化学计算过程中的热力学数据。本文基于Shermo程序&#xf…

数据库设计篇-范式与反范式

概述 一般地&#xff0c;在进行数据库设计时&#xff0c;应遵循三大原则&#xff0c;也就是我们通常说的三大范式&#xff0c;即第一范式要求确保表中每列的原子性&#xff0c;也就是不可拆分&#xff1b;第二范式要求确保表中每列与主键相关&#xff0c;而不能只与主键的某部…

抖音林客生活服务商平台

抖音林客生活服务服务商平台是为了方便服务商管理自己的服务和订单而设计的平台。以下是其主要功能&#xff1a; 服务管理&#xff1a;服务商可以在平台上添加自己提供的服务&#xff0c;并设置服务的价格、规格等信息&#xff1b; 订单管理&#xff1a;服务商可以查看…

【Git总结】

第三章Git常用命令 Git注意首次 安装必须设置一下用户签名&#xff0c;否则无法提交代码。 vim 文件名&#xff08;hellow.txt&#xff09;//进入编辑模式 cat 文件名&#xff08;hellow.txt&#xff09;//查看文件内容 i进入编辑模式&#xff0c;(Esc):wq保存退出 &#…

掌握imgproc组件:opencv-图像处理

图像处理 1.线性滤波&#xff1a;方框滤波、均值滤波、高斯滤波1.1 平滑处理1.2 图像滤波与滤波器1.3 线性滤波器的简介1.4 滤波和模糊1.5 邻域算子与线性邻域滤波1.6 方框滤波1.7 均值滤波1.8 高斯滤波1.9 线性滤波综合案例 2.非线性滤波&#xff1a;中值滤波、双边滤波2.1 中…

python自定义序列类深入学习

一&#xff1a;自定义序列类 1、序列类型的分类 容器序列&#xff1a; list 、 tuple、deque 扁平序列&#xff1a; str 、bytes、bytearray、arry.array 可变序列&#xff1a; list 、deque、bytearray、array 不可变&#xff1a; str、tuple、bytes 容器序列表示可以放置任意…

计算机中CPU、内存、缓存的关系

CPU&#xff08;Central Processing Unit&#xff0c;中央处理器&#xff09; 内存&#xff08;Random Access Memory&#xff0c;随机存取存储器&#xff09; 缓存&#xff08;Cache&#xff09; CPU、内存和缓存之间有着密切的关系&#xff0c;它们共同构成了计算机系统的核…

软考高级系统架构设计师(八) 基于中间件的开发实际项目

目录 中间件的用途 中间件技术 中间件的特点 中间件的十大优越性 企业应用集成 轻量级架构 Struts框架 spring Hibernate 实际项目举例 产品逻辑大图 gRPC的接口规范 关键中间件交互 整体架构设计 大数据素材底层处理 业务交互大图 底层数据素材加工大图 中间…

这些年你走了多少弯路?接口性能测试你真的懂了?进阶测试...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 性能测试关注 响…