[JavaEE初阶] 类加载机制

news2024/11/26 8:19:51

在真正的战争到来之前,尽可能地变得强大吧~

文章目录

  • 前言
  • 1. 类加载
    • 1.1 类加载的过程
    • 1.2 类加载的时机
    • 1.3 双亲委派模型


前言

这个问题是面试经典题,让我们来求甚解吧~


1. 类加载

1.1 类加载的过程

如下图
在这里插入图片描述

  1. 加载,找到.class文件,读取文件内容
  2. 验证,验证.class文件的格式是否符合JVM虚拟机规范,确保加载了该 class 文件不会导致 JVM 出现任何异常,不会危害JVM 的自身安全。
  3. 准备,给类对象分配内存空间,这里是在方法区为类对象开辟空间,并将对象值初始化成零值.即int型初始化为0,引用型初始化为null.
  4. 解析,将常量池的符号引用转为直接引用.在这之前,这个引用记录的并不是字符串常量的真正地址,而是记录在文件中的相对偏移量,相当于先占个位置.类加载之后,才真正把字符串常量的地址放进去.这个引用才被真正的赋值成内存地址.
  5. 初始化,类加载的最后一步,执行Java代码,这时,才真正的对类对象进行初始化.此阶段会根据代码进行类变量和其他资源的初始化.编译器收集的顺序是由语句在源文件中出现的顺序决定的.

观察下图的执行结果
在这里插入图片描述
在这里插入图片描述
改变顺序,结果改变
在这里插入图片描述
在这里插入图片描述

1.2 类加载的时机

遇到 new、getstatic、putstatic、invokestatic 字节码指令,例如:使用 new 实例化对象;
读取或设置一个类的 static 字段(被 final 修饰的除外);
调用类的静态方法。
对类进行反射调用;
初始化一个类时,其父类还没初始化(需先初始化父类);
这点类与接口具有不同的表现,接口初始化时,不要求其父接口完成初始化,只有真正使用父接口时才初始化,如引用父接口中定义的常量。

虚拟机启动,先初始化包含 main() 函数的主类;

1.3 双亲委派模型

如下图,是JVM默认提供的三种类加载器.它们存在父子关系.
在这里插入图片描述
加载一个类的时候,从ApplicationClassLoader开始,但ApplicasionClassLoader会先把加载任务交给父亲ExtensionClassLoader去完成.
ExtensionClassLoader要加载了,他也把这个任务交给他的父亲BootstrapClassLoader去完成.
接着,BootstrapClassLoader也想交给自己的父亲,但他发现自己父亲为空,就只能去搜索自己负责的标准库目录的相关的类,找到的就加载,没找到的,就交给子类加载器进行加载.
之后,ExtensionClassLoader去搜索与扩展库相关的目录,如果找到就加载,没找到的,交给子类加载器进行加载
之后,Applicaton开始真正搜索与用户项目有关的目录,找到了,就加载,找不到,就会报错了.

那么,为什么要这么麻烦,不是直接从上到下的呢?由于JVM使用递归来实现的,所以,才导致了这个顺序.另外,先加载底层的类,能保证,当用户代码出错时,只需修改用户代码即可,不会出现太严重的bug.如果用户写了与标准库重名的一些类,由于执行顺序,JVM加载的还是标准库中的类,不会用用户自己写的类.并且,用户可以自定义类加载器,将自己的类加载器加入上述流程中,与自带的类加载器配合使用.

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

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

相关文章

IntelliJ IDEA 接入ChatGPT (免费,无需注册)生产力被干爆了!

IntelliJ IDEA 接入ChatGPT 前言 : 今天给大家介绍一款好用的 IntelliJ IDEA ChatGPT 插件 可以帮助我们写代码,以及语言上的处理工作,以及解释代码。让我们的生产力大大提高! 一. ChatGPT-Plus 功能介绍 支持最新idea版本AI询问功能,写好…

记录一次adb+frida+hook学习经过

adb连接模拟器 adb devices 查看adb 连接设备 offline 表示设备未连接成功或无响应,device 设备已连接 未连接就使用adb connect 127.0.0.1:端口号 各种模拟器端口号及模拟器连接方式_雷电模拟器 调式串口_宋学慧的博客-CSDN博客 举个栗子 常见adb命令 adb vers…

NXP公司LPC21XX+PID实现稳定温度控制

本例使用的是LPC21XX系列芯片提供的PWM功能实现稳定的温度控制。首先我们获得当前环境温度之后,再用设定的温度与当前温度相减,通过PID算法计算出当前输出脉宽,并将其输出到L298N模块中,使加热丝发热,形成闭环&#xf…

Java核心技术 卷1-总结-18

Java核心技术 卷1-总结-18 同步Volatile域final变量原子性死锁线程局部变量锁测试与超时读/写锁 同步 Volatile域 多处理器的计算机能够暂时在寄存器或本地内存缓冲区中保存内存中的值。结果是,运行在不同处理器上的线程可能在同一个内存位置取到不同的值。编译器…

建仓价和持仓价的应用:如何开仓如何持仓

建仓、持仓,是交易中绕不开的话题,没有建仓、持仓,何来建仓价、持仓价呢?所以这也是基础问题。不过作为市场形式的表现来说,建仓、持仓到后来的平仓贯彻始终,虽然是基础问题,也是后面登堂入室、…

【图数据库实践教程】Ubuntu22.04-Neo4j中文版安装及导入owl文件(通用教程)

文章目录 0. 环境准备0.1 静态配置IP:192.168.1.54,及网卡类型:NAT模式0.2 激活root用户:0.3 更改apt国内镜像源(下载快)0.4 关闭相关防火墙等保证网络顺畅 1. 相关软件安装1.1 安装好服务器内的相关软件1.…

FL Studio2023中文版数字音频工作站(DAW)软件

FL Studio21水果软件能支持制作各种音乐类型,除了最擅长的电子音乐,还可以任意创作流行音乐、古典音乐、民族音乐、乡村音乐、爵士乐等等,没有音乐类型的限制,让你的音乐突破想象力的限制。 FL Studio 2023中文版是数字音频工作站…

LINUX的系统管理与维护命令

文章目录 一、LINUX的系统管理与维护命令总结 一、LINUX的系统管理与维护命令 - Linux ls命令:显示指定工作目录下的内容 Linux pwd命令:显示当前工作目录 Linux cd命令:切换工作目录 Linux date命令:显示或设置系统时间 Linux su命令:切换用户 Linux clear命令:清除屏幕 Li…

5种简单快速的方法解除PDF文件密码保护

PDF 文件已经成为了我们日常工作、学习中广泛使用的文档格式之一。为了对重要的 PDF 文件进行保护,我们有时需要添加密码保护功能来防止未授权访问或修改。但是,如果您的 PDF 文件已经有了密码保护,而您需要快速访问和编辑它们,那…

机器人工程师与孔乙己文学

本文内容严格按创作模板发布: 孔乙已是鲁迅笔下人物,穷困流倒还穿着象征读书人的长衫,迁腐、麻木。最近,大家自我调佩是“当代孔乙己”,学历成为思想负担,找工作时高不成低不就。你可以从以下几个角度说说…

static_cast、dynamic_cast和reinterpret_cast区别和联系

其实网上相关的资料不少,但是能够说清楚明白这个问题的也不多。 于是,我尝试着问了一下AI,感觉回答还可以,但是需要更多的资料验证。 让我们先看看AI是怎么回答这个问题的。 static_cast、dynamic_cast和reinterpret_cast都是C中…

“SCSA-T学习导图+”系列:路由技术之OSPF入门

本期引言: 路由技术是网络环境中,为不同的节点传输数据提供传输路径的技术,企业网络的拓扑一般会比较复杂,不同的部门或者总部和分支可能处于不同的网段中,此时就需要使用路由协议来连接不同的网段,实现数…

Parker机电产品(运动控制/伺服电机/直线电机)在FPD行业应用

Parker新控制器-PAC PAC集高级逻辑控制,多轴运动,信号处理和webpublished可视化功能。 采用工业主流的EtherCAT运动控制协议,I/O扩展和第三方设备链接,结合应用开发软件PARKERAutomation Manager , PAC能为OEM需要的…

微信仿真平台的设计和实现(设计+源码)_kaic

摘要 现如今,科技的发展带动着环保方式的更新,Internet是一个不断的开展和不停的扩充数据潮流,有了它,我们可以快速、容易地在世界的任何角落进行沟通,获取更多的信息与资料。Internet可以提供大量信息资源和文案数据库…

临近五一,游玩地点想好了吗,Python帮你查找旅游景点的详细数据

前言 好不容易没有了疫情,三年整整三年,都要把我憋死了,想到去年暑假的时候,准备去厦门,攻略做好了,厦门疫情来了,想着转去济南也是这样,去三亚,结果收到好几万人都被留…

5G网络切片路由选择策略介绍

终端保存的NSSP(Network Slice Selection Policy)策略来源于网络侧。 NSSP规则是将应用程序匹配到S-NSSAI(Single network slice selection assistance information),并将应用程序绑定到现有PDU会话或发起新的PDU会话。 NSSP功能 NSSP的作用就是为应用程序选择S-NSSAI和…

HashMap如何解决哈希冲突

HashMap如何解决哈希冲突 Hash算法和Hash表Hash冲突解决哈希冲突的方法开放地址法链式寻址法再hash法建立公共溢出区 Hash算法和Hash表 Hash算法就是把任意长度的输入通过散列算法编程固定长度的输出。这个输出结果就是一个散列值。 Hash表又称为“散列表”,它是通…

LVS负载均衡群集部署——DR直接路由

目录 一、LVS-DR模式二、LVS-DR模式的特点三、LVS-DR中的ARP问题 二、LVS负载均衡群集-DR模式部署1.配置nfs共享(192.168.154.10)2.部署第一台nginx服务(192.168.154.11)3.部署第二台nginx服务(192.168.154.12&#xf…

React入门学习

参考资料:https://bright-boy.gitee.io/technical-notes/#/react/React%E5%85%A5%E9%97%A8 https://github.com/xzlaptt/React react学习01: https://docs.qq.com/doc/DSG1jdUJtQ3FYR1V1 react学习02: https://docs.qq.com/doc/DSGhGZk9PUm1KVldv React简介 框架定…

滚动数组-动态规划之-不同路径 II_20230421

DP动态规划之-滚动数组 前言 在学习 不同路径II 的动态规划过程中,从介绍资料中了解到 滚动数组可以进一步降低动态规划解空间的复杂度,更高效利用计算机的储存空间。动态规划中的滚动数组究竟能发挥哪些作用,在常规的动态规划中&#xff0…