Java类加载机制介绍

news2024/12/27 11:03:19

类加载机制的简单介绍

类加载机制是指将.class字节码文件读入到内存中。在运行时数据区中的方法区保留类的数据结构,在堆中创建一个与之对应的Class对象。

类的生命周期主要经历7个阶段:加载、验证、准备、解析、初始化、使用、卸载
其中从加载到初始化是类的加载过程

类加载的时机:java虚拟机规范中并没有对其进行约束,大多数情况下都是根据“什么时候初始化”来决定什么时候来进行加载,初始化阶段开始之前还是必须要经历加载、验证、准备、解析各阶段的

类加载过程:在类加载的过程中,加载、验证、准备、解析、初始化这五个阶段是交叉配合运行的,在这五个阶段中验证的能力会被频繁使用到,例如在加载和解析阶段会频繁的使用验证能力去检验.class字节码文件的正确性。

加载、验证、准备、解析、初始化

在这里插入图片描述
加载:在加载阶段,虚拟机需要完成以下三件事情:

  1. 通过一个类的全限定名去找其对应的.class字节码文件
  2. 将.class字节码文件中的二进制数据读取到方法区
  3. 在堆中生成一个与之对应的Class对象,作为方法区中该类的访问入口

验证:该阶段主要目的是保证字节码文件内容中的字节流符合Java虚拟机规范,不会危害JVM。验证阶段会完成以下校验:文件格式验证、元数据验证、字节码验证、符号引用验证,验证阶段是非常重要但不是必须的,可以通过-Xverify:none参数来关闭大部分的验证措施来缩短类加载的时间

准备:该阶段中会给类中的静态字段信息分配内存空间,并设置初始值

  1. 该阶段内存分配仅包括static修饰过的静态变量,实例变量是等到对象实例化时才会分配内存
  2. 初始值是变量类型的默认值,而不是在Java代码中显示赋予的值,但是,如果当字段信息被final关键字修饰过后就会变成常量,这个初始值就是Java代码中显示赋予的值
  3. JDK8之后取消了永久代,这些静态变量的内存空间实际是被分配在Java堆中的

解析:该阶段会把.class字节码文件中常量池内的符号引用转换为直接引用,把符号引用转化为直接引用的过程可以理解为当前加载的这个类和它所引用的类正式建立连接的过程

  1. 什么是符号引用?
    • Java代码在编译期间一开始是不知道最终引用的类型,具体在内存中的哪个位置的,这时候会用一个符号引用来表示最终引用的目标是谁,JVM对符号引用的形式做了规范,符合这个规范的符号引用可以是任何值,只要能通过该值定位到最终目标即可
    • 主要解析的是类、接口、字段、类方法、接口方法等符号引用
  2. 什么是直接引用?
    • 直接或间接指向指向内存中目标位置的指针或句柄
  3. 如果引用的类型还未加载初始化就会触发该引用类型的加载和初始化

初始化: 初始话的过程就是执行类构造器()方法的过程。当初始化完成之后,静态会被赋予程序员实际定义的“值”,同时如果类中存在静态代码块也会执行该静态代码快中的代码

  1. ()方法的内容是什么?
    • 在准备阶段已经给静态变量赋予的默认值,()方法的作用是给这些静态变量赋予程序员实际定义的“值”,同时执行类中静态代码块中的代码
  2. ()方法是什么?
    • 首先()方法和()方法是两个不同的方法,一个是类构造器一个是实例构造器,JVM会保证在子类()方法执行前,父类的()方法已经执行完毕,而()方法在执行时自己会显式的调用父类的构造器。
    • ()方法由编译器自动生成,但不是必须生成的,只有当前类中存在static修饰的变量时或存在静态代码块时才会自动生成。

类加载过程总结:当一个符合Java虚拟机规范的字节码文件经过类加载过程之后,会根据虚拟机的规定在方法区保留一个该类的数据结构信息,然后在堆中创建一个与之对应的Clas对象,该对象描述了这个类的所有信息,并提供了在方法区中访问该类的入口

在这里插入图片描述
在使用同一个类加载器的情况下,方法区中每个类只会有一份.class字节流信息,同理,在堆中每个类也会只有一份该对应的Class对象

类加载器

类加载器根据类的全限定名通过执行某些行为来获取的类的字节码数据流

类加载器的三种分类:启动类加载器、扩展类加载器、应用程序类加载器

启动类:负责加载<JAVA_HOME>\lib目录中的jar包。该启动类由c++实现

扩展类:负责加载Java平台扩展功能的jar包,由java实现

应用程序类:我们自己开发的应用程序,由它负责加载,负责加载ClassPath路径下所有jar包

双亲委派机制:任何一个类加载器在接收到一个类的家在请求时,都会先让其父类加载器进行加载、只有父类加载器无法加载的情况下,才会尝试自己去加载

双亲委派机制的好处:不同的类加载器、加载同一个类其导致的的结果就是JVM的内存地址中会保存两份该类的数据结构信息,当进行==号判断两个类是否相等时,其结果必定是不相等的。使用双亲委派机制可以保证每一个类都只会有一个类加载器,从而从根本上避免该情况

参考:
Java类加载机制 - 知乎 (zhihu.com)

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

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

相关文章

如何通俗易懂的解释无线通信中的那些专业术语!

这是一篇来自网络的非常经典的一篇老文&#xff0c;原作者不详&#xff0c;但非常值得一读&#xff01; 香农定理 类比&#xff1a;城市道路上的汽车的车速和什么有关系&#xff1f;和道路的宽度有关系&#xff0c;和自己车的动力有关系&#xff0c;也其他干扰因素有关系&…

Unity接SDK - 极光推送

2021.09.09记录&#xff0c;2023发布&#xff0c;如有不对&#xff0c;还请包含。发晚了 如果想看Android原生接入JPush - SDK&#xff0c;移步Android原生集成JPush SDK_jpush android sdk v4.7.2 极光推送 - 接入 版本&#xff1a; Unity 2020.3.10f1 JPush - Unity 3…

linux系统安全及应用

目录一、账号安全控制1.1基本安全措施1.1.1系统账号的清理1.1.1.1将非登录用户的Shell设为/sbin/nologin1.1.1.2锁定长期不使用的账号1.1.1.3删除无用账号1.1.1.4锁定账号文件passwd、shadow1.1.2密码安全控制1.1.2.1设置密码有效期1.1.2.2要求用户下次登录时修改密码1.1.3命令…

服务端开发之Java秋招面试11

努力了那么多年,回头一望,几乎全是漫长的挫折和煎熬。对于大多数人的一生来说,顺风顺水只是偶尔,挫折、不堪、焦虑和迷茫才是主旋律。我们登上并非我们所选择的舞台,演出并非我们所选择的剧本。继续加油吧&#xff01; 目录 1.MySQL的多版本并发控制具体实现过程&#xff1f;…

目标检测YOLO系列-YOLOVX运行步骤(推理、训练全过程)

下载项目&#xff1a;点击下载 进入项目根目录&#xff08;通过cd命令&#xff09; apex的安装与下载 下载apex git clone https://github.com/NVIDIA/apex进入apex目录 cd apex执行安装命令 python setup.py install首先安装相关的类库&#xff1a; pip install -i https://p…

深入学习MongoDB---1---入门篇+基础重点篇

MongoDB入门 MongDB作为NoSQL数据库之一&#xff0c;主要关注&#xff1a;灵活性、扩展性、高可用灵活性&#xff1a;NoSQL的特点就是反范式理论&#xff0c;为数据的水平扩展和字段的组织提供了巨大的便利高可用&#xff1a;天生就伴随副本集&#xff08;从节点&#xff09;的…

计数排序的实现

计数排序是非比较排序的一种&#xff0c;是对哈希直接定址法的变形应用&#xff0c;其操作步骤如下&#xff1a; 1.统计相同元素出现的次数。 2.根据统计结果将序列回收到原来的序列中。 拿一组重复元素较多的数组来举例子&#xff1a; 10 11 10 15 14 15…

Disruptor-源码解读

前言 Disruptor的高性能&#xff0c;是多种技术结合以及本身架构的结果。本文主要讲源码&#xff0c;涉及到的相关知识点需要读者自行去了解&#xff0c;以下列出&#xff1a; 锁和CAS伪共享和缓存行volatile和内存屏障 原理 此节结合demo来看更容易理解&#xff1a;传送门…

数云融合|新手入门,5分钟秒懂开源

目录一、开源软件开源领域的两大组织&#xff1a;FSF和OSI二、开源许可证开源意味着免费吗&#xff1f;三、开源技术应用领域四、总结一、开源软件 开源即开放源代码&#xff0c;他的核心是源代码公开&#xff0c;任何人都可以查看、使用、修改和分发。与之相对的是闭源&#…

js排序算法

排序算法 - jsjs交换两个值的三种方法方式1&#xff1a;算术运算方式2&#xff1a;ES6解构方式3&#xff1a;数组的特性冒泡排序实现思路图解bubbleSort参考视频选择排序实现思路图解selectionSort参考视频插入排序实现思路图解insertionSort参考视频js交换两个值的三种方法 方…

javaSccript---call()、 bind()、 apply()的区别

call()、apply()、bind() 都是用来重定义 this 这个对象的 语法&#xff1a; function.apply(thisArg, [argsArray])//argsArray 是一个可选的数组 function.call(thisArg, arg1, arg2, ...)//arg1、arg2、... 是将传递给函数的参数列表 function.bind(thisArg, arg1, arg2, ..…

Webstorm是什么软件?你了解吗

WebStorm 是一款由 JetBrains 开发的集成开发环境&#xff08;IDE&#xff09;&#xff0c;它是专门为开发 Web 应用程序而设计的。它提供了许多功能&#xff0c;例如代码自动完成、错误突出显示、重构、调试、版本控制等&#xff0c;可以帮助开发人员提高效率和代码质量。WebS…

Vector 高性能日志收集工具

文章目录Vector 简介相关概念事件Data modelEvent typesLog eventsMetric eventsTraces组件构成源转换接收器PipelineBuffersBackpressureRolesAgentDaemonSidecarAggregatorTopology分布式集中式基于流Vector 简介 Vector 是一种高性能的可观察性数据管道&#xff0c;可让组织…

天梯赛练习集-L1-031到L1-040–python - java

文章目录PythonL1-031 到底是不是太胖了L1-032 Left-padL1-033 出生年L1-034 点赞L1-035 情人节L1-036 A乘以BL1-037 A除以BL1-038 新世界L1-039 古风排版L1-040 最佳情侣身高差JavaL1-031 到底是不是太胖了L1-032 Left-padL1-033 出生年L1-034 点赞L1-035 情人节L1-036 A乘以B…

ChatGPT入门必知必会

2023年是真正意义上的AI之年&#xff0c;因为ChatGPT 2007年&#xff0c;iPhone开启了智能手机时代&#xff0c;2023年&#xff0c;我们迎来了人工智能时代&#xff0c;我们正处于历史的大转折点上&#xff0c;这也许是启蒙运动级别的思想和社会转折&#xff0c;工业革命级别的…

5万元内最经济双卡4090深度学习方案

深度学习双卡4090攒机方案 znsoft 一枚快乐的炼丹师 AMD 7950x 双4090方案 不到5万&#xff0c;目前最经济的双卡人工智能服务器方案 主板&#xff1a; 华硕 x670EA 吹雪 3000元 CPU: amd 7950x 3500元 内存&#xff1a; 32G4 128G DDR5 800x4 3200元 机箱&#xff1a; 追…

【eMMC学习记录】emmc相关名词解释和基础概念

名词解释 NAND Flash:半导体闪存 HDD&#xff1a;机械硬盘 FW:固件 Peak Power:峰值功率 Active Power:读写功耗 Idle Power:空闲功耗 standby/sleep Power Dev Sleep Power:SSD内部休眠功耗 RAM:掉电丢失数据 FGT:浮栅晶体管 FormFactor:尺寸标准件 AFA:全闪存整列…

线段树之延迟数组_20230410

线段树 之 延迟数组 前言 线段树是一类特殊的完全二叉树&#xff0c;其本质是对递归过程信息的再处理和再记忆&#xff0c;线段树构造完成后&#xff0c;可以脱离原始数组或线性表&#xff0c;直接对线段树进行查询或更新操作即可。线段树的储存结构和堆结构类似&#xff0c;…

springboot——集成elasticsearch进行搜索并高亮关键词

目录 1.elasticsearch概述 3.springboot集成elasticsearch 4.实现搜索并高亮关键词 1.elasticsearch概述 &#xff08;1&#xff09;是什么&#xff1a; Elasticsearch 是位于 Elastic Stack 核心的分布式搜索和分析引擎。 Lucene 可以被认为是迄今为止最先进、性能最好的…

软测界的黑科技,难道不来瞧瞧?

写在前面&#xff1a; 在当今互联网时代&#xff0c;软件已经渗透到了人们生活的方方面面&#xff0c;各种类型的软件应运而生&#xff0c;为人们的工作和生活提供了更便捷的服务。然而&#xff0c;随着软件的不断增长和复杂性的不断提高&#xff0c;软件测试变得越来越重要。…