[JavaEE初阶] 类加载机制

news/2024/3/29 17:24:37/文章来源:https://blog.csdn.net/scsery/article/details/130349033

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

文章目录

  • 前言
  • 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.luyixian.cn/news_show_103675.aspx

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

相关文章

SQL优化(3):order by优化

MySQL的排序,有两种方式: Using filesort : 通过表的索引或全表扫描,读取满足条件的数据行,然后在排序缓冲区sort buffer中完成排序操作,所有不是通过索引直接返回排序结果的排序都叫 FileSort 排序。 Using index :…

Spring lettuce读写分离

Redis 的 Sentinel 模式默认配置下 Redis 的客户端只对 Master 读写,另外2个Slave闲置。若主从节点在不同机房,在读取时会有跨机房的网络时延,并且比同机房访问更容易发生网络丢包。故在一些场景可以考虑将跨机房的服务节点设置为读写分离 Re…

Python中 re.findAll()、re.sub()、set()的使用

1. re.findall() re.findall():函数返回包含所有匹配项的列表。返回string中所有与pattern相匹配的全部字串,返回形式为list / 数组。 由函数原型代码可知,findall() 函数存在三个参数: 1. pattern:正则表达式中的 ‘模…

Opencv+Python笔记(五)图像阈值化处理

图像阈值化可以理解为一个简单的图像分割操作,阈值又称为临界值,它的目的是确定出一个范围,然后这个范围内的像素点使用同一种方法处理,而阈值之外的部分则使用另一种处理方法或保持原样。 阈值处理有2种方式,一种是固…

订单交期迟滞,销售回应慢,怎么解决客户问题?

按客户定制产品订单,进行报价和生产的制造企业,有拆解图纸生成物料BOM的工序,通常由企业产品设计部门的拆图员岗位专门负责。 手工制作BOM数据,准确性低 拆图员肉眼查看每页图纸中的表格数据,手动敲键盘填入到企业要…

Android之 颜色选择器

一,简介 1.1 计算机的颜色通常有两种表示方式: 光源模式RGB(Red红, Green绿, Blue蓝),数值0-255 印刷模式CMYK(Cyan青, Magenta品红, Yellow黄, Black黑),数值1-100 任何颜色都是由RGB或CMYK混合出来的,再加上透明度…

【HTML+CSS+JS】登录注册页面大合集

前言 学JS也学了一段时间,正巧碰上了人工智能要调用人脸识别接口进行真人人脸识别,于是便萌生了用人脸来进行注册和登录的想法,这样的话就需要开发一个登录注册页面,然后用JS绑定注册事件调用人脸识别接口进行登录注册 饭要一口一…

【数据结构:线性表】单链表

在学习了顺序表,我们可能会对其有一些思考: 中间/头部的插入删除,时间复杂度为O(N)增容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗。增容一般是呈2倍的增长,势必会有一定的空间浪费。例如当前容…

【校招VIP】面试了一个抽奖的项目,我终于搞明白了,是8股文终于开始作恶了

最近因为招实习生,进行了很多次面试。 但面试的结果不尽人意。 就感觉今年的面试跟以前差距太大了。 直到经过这个同学的面试,我终于明白了是什么原因。 这个同学是南京一所211的研究生,他的项目经历是做了一个抽奖的微服务管理平台。 也…

10、Mysql常见面试题

Mysql常见面试题 文章目录 Mysql常见面试题一 Mysql索引001 Mysql如何实现的索引机制?002 InnoDB索引与MyISAM索引实现的区别是什么?003 一个表中如果没有创建索引,那么还会创建B树吗? 004 说一下B树索引实现原理(数据…

2023移动云大会 | “六大”服务承诺 全力做优“心级服务”

4月25日,以“云擎未来 智信天下”为主题的2023移动云大会在苏州金鸡湖国际会议中心举办,众多政府领导、院士专家、知名企业客户与合作伙伴高层等数千名嘉宾齐聚一堂。 大会期间,移动云深入践行“为国建云”的使命,推出“六大”服…

电感知识大全

目录 一、电感的种类 1、共模电感 2、差模电感 3、工字电感 功率电感 4、磁珠 5、变压器 6、R棒电感、棒形电感、差模电感 二、电感符号 三、电感特性 前面在学习电容的时候,为了让大家更形象,更通俗的去理解这个元器件,都是拿水缸去…

【Vue 移动端开发】适配百分之99的屏幕方案

之前提起移动端适配,都是一些视口的概念,包括物理像素和逻辑像素,理想视口,dpr等等等。利用 media query 和 rem 是最常见的移动端适配方案。如下代码: const deviceWidth document.documentElement.clientWidth || …

为什么很多程序员不反感加班?行内人:老板给钱是真的给啊

为什么很多程序员不反感加班?行内人:说给钱老板真的给! 一提到程序员,大部分人第一反应是加班多、996、脱发,这几乎成了外界对程序员刻板印象的标配。不少知名的互联网大厂也是加班之风盛行,譬如著名的华为…

论文阅读:Heterogeneous Graph Contrastive Learning for Recommendation(WSDM ’23)

论文链接 Motivation: 在推荐系统中,图神经网络在建模图结构数据上已经变成一个强有力的工具。但是现实生活的推荐语义通常涉及异质关系(像用户的社交关系,物品知识关系的依赖),这些都包含丰富的语义信息…

17、Logos使用摘要

本篇将讲述如何将WX的设置界面添加两个自定义的UI行: 包含是否启用某功能的开关,以及手速设置.并且如何定位到修改的代码.采用的是砸过壳的包. 成品也就是增加了两个UI及开关联动效果、 界面分析 如果我们要破解别人的App, 首先从界面UI入手,定位UI 1、使用class-dump导出全部…

直升机空气动力学基础---002 桨叶的主要参数

源于 1.桨叶的平面形状和主要参数 由于其设计制造比较简单,早期直升机大多采用矩形桨叶,缺点是在高速气流中,无法抑制桨尖涡,会消耗向下的诱导速度,降低旋翼的拉力。现代多采用梯形桨叶。 桨尖后掠能够降低桨尖涡 …

Flowable打印调用原生API查询接口的SQL日志

一.简介 建议在 Spring Boot 的 application.properties 中添加如下配置,开启 flowable 日志: logging.level.org.flowabledebug这个配置表示开启 flowable 的日志,开启日志的好处是可以看到底层的 SQL语句。 二.查询部署信息 例如查询流…

使用 chat_flutter 进行聊天记录展示

前言 最近需要实现一个聊天记录的页面展示,在网上发现没有适合自己的,于是自己就造了一个,总体感觉还不赖。 下面奉上地址、效果图和教程。 效果图 地址 github: https://github.com/xiaorui-23/chat_fluttergitee: https://gitee.com/xi…

selenium_交互 (谷歌浏览器驱动下载 xpath插件安装)

安装selenium (1)查看谷歌浏览器版本 谷歌浏览器右上角 ‐‐> 帮助 ‐‐> 关于 查看 浏览器版本: (2)操作谷歌浏览器驱动下载地址 http : // chromedriver . storage . googleapis . com / index . html 找到…