JVM类加载(类加载过程、双亲委派模型)

news/2024/5/21 23:24:19/文章来源:https://blog.csdn.net/crazy_xieyi/article/details/127394917

系列文章目录

JVM的内存区域划分_crazy_xieyi的博客-CSDN博客


文章目录

  • 一、类加载过程
  • 二、关于类加载的典型试题
  • 三、双亲委派模型

一、类加载过程

对于一个类来说,它的生命周期是这样的:

1.加载

加载Loading)阶段是整个类加载Class Loading)过程中的一个阶段,它和类加载 Class
Loading 是不同的,一个是加载 Loading 另一个是类加载 Class Loading,所以不要把二者搞混了。
在加载 Loading 阶段,Java虚拟机需要完成以下三件事情:
1)通过一个类的全限定名来获取定义此类的二进制字节流。
2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。
3)在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口

 2.验证

验证是连接阶段的第一步,这一阶段的目的是确保Class文件的字节 流中包含的信息符合《Java虚拟机规范》的全部约束要求,保证这些信 息被当作代码运行后不会危害虚拟机自身的安全。
验证选项:
文件格式验证
字节码验证
符号引用验证...
3.准备
准备阶段是正式为类中定义的变量(即静态变量,被static修饰的变量)分配内存并设置类变量初始值的阶段。
比如此时有这样一行代码:
public static int value = 123;
//它是初始化 value 的 int 值为 0,而非 123。

4.解析 

解析阶段是 Java 虚拟机将常量池内的符号引用替换为直接引用的过程,也就是初始化常量的过程。
5.初始化
初始化阶段,Java 虚拟机真正开始执行类中编写的 Java 程序代码,将主导权移交给应用程序。初始化阶段就是执行类构造器方法的过程。

二、关于类加载的典型试题

这段代码的输出结果是什么?

class A{public A(){System.out.println("A的构造方法");}{System.out.println("A的构造代码块");}static {System.out.println("A的静态代码块");}
}
class B extends A{public B(){System.out.println("B的构造方法");}{System.out.println("B的构造代码块");}static {System.out.println("B的静态代码块");}
}
public class test extends B{public static void main(String[] args) {new test();new test();}
}

 解析:

我们的程序是从main开始执行的,那么main这里是test方法,所以,要执行main,就要先加载test。也就是说,在加载test类的时候,此时还没执行main。

test继承自B,要加载test,那么就要先加载B;

B继承自A,要加载B,那么就要先加载A;

总之,只要这个类被用到了,就要先加载这个类(实例化、调用方法、调用静态方法,被继承...都算被用到)。

然后,要想要构造test,就得先构造B,要想构造B,就得先构造A,那么对于A来说,构造过程 = 构造代码块的执行 + 构造方法的执行。

还有,静态的只执行一次,所以输出结果是:

三、双亲委派模型

双亲委派模型是类加载中的一个环节,这环节处于Loading阶段。

双亲委派模型,描述的就是JVM中的类加载器,如何根据类的全限定名( java.lang.String )找到.class文件的过程。

JVM里提供了专门的对象,叫做类加载器,负责进行类加载.当然找文件的过程也是类加载器来负责的。

.class 文件,可能放置的位置有很多.有的要放到JDK目录里,有的放到项目目录里,还有的在其他特定位置,因此JVM里面提供了多个类加载器,每个类加载器负责一个片区。

默认的类加载器主要是三个:

1.BootStrapClassLoader负责加载标准库中的类(String, ArrayList, Random, Scanner..)

2.ExtensionClassLoader负责加载JDK扩展的类.(现在很少会用到)

3.ApplicationClassLoader 负责加载当前项目目录中的类~~

其实程序猿还可以自定义类加载器,来加载其他目录中的类。Tomcat就自定义了类加载器,用来专门加载 webapps里面的.class 。双亲委派模型,就描述了这个找目录过程,也就是上述类加载器是如何配合的。

1.加载java.lang.String

a.程序启动,先进入ApplicationClassLoader类加载器

b.ApplicationClassLoader就会检查下,它的父加载器是否已经加载过了.如果没有,就调用父类加载器ExtensionClassLoader

c. ExtensionClassLoader也会检查下,它的父加载器是否加载过了.如果没有,就调用父类加载器BootStrapClassLoader

d.BootStrapClassLoader也会检查下,它的父加载器是否加载过,自己没有父亲~~于是自己扫描自己负责的目录

e. java.lang.String这个类在标准库中能找到! 直接由BootStrapClassLoader负责后续的加载过程.查找环节就结束了

 2.加载自己写的test类

a.程序启动,先进入ApplicationClassLoader类加载器

b.ApplicationClassLoader就会检查下,它的父加载器是否已经加载过了.如果没有,就调用父类加载器ExtensionClassLoader

c. ExtensionClassLoader也会检查下,它的父加载器是否加载过了.如果没有,就调用父类加载器BootStrapClassLoader

d.BootStrapClassLoader也会检查下,它的父加载器是否加载过,自己没有父亲~~于是自己扫描自己负责的目录,如果没有扫描到,就回到子加载器继续扫描。

e.ExtensionClassLoader也扫描自己的目录,如果没有扫描到,就回到子加载器继续扫描。

f.ApplicationClassLoader也扫描自己负责的目录,能找到test类,于是进行后续加载,查找目录的环节结束。

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

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

相关文章

spring 如何解决循环依赖

什么是循环依赖 A 类中有一个属性 B ,也就是说 A 依赖 B,同时 B 类中有一个属性 A, 也就是说 B 依赖 A. 他们之间的依赖关系形成了环。就是我们说的循环依赖,如下图: 循环依赖示例 public class CircularDependenciesDemo {publ…

SSM基于上述环境实现简单CUDA操作

目录 1. 结构 2. 环境: 3. controller 4. mapper 5. service 6. serviceImpl 7. mapper.xml 8. emplist.html 9. update 1. 结构 2. 环境: SSM整合 Spring SprintMVC Mybatishttps://blog.csdn.net/qq_41950447/article/details/128033971 3.…

Android -- 每日一问:Activity的启动模式(launchMode)有哪些,有什么区别?

经典回答 这应该是一道很虐人的面试题,很多人都答不上来,很多人根本就没有用过。当我发现在被我面试的人中有80%的比例对它不了解时,我找过一些同事讨论是否还有在面试中考查这个问题的必要,得到的回答是“程序员何苦为难程序员”…

2020-RKT

2020-RKT:Relation-Aware Self-Attention for Knowledge Tracing 有代码:https://github.com/shalini1194/RKT 摘要 学生在解决练习的过程中获得技能,每一次这样的互动都对学生解决未来练习的能力有明显的影响。 这种影响表现为:1)互动中涉…

电脑c盘满了怎么清理,快速清理,用这5招

​新买的电脑没用多久,突然发现系统提示磁盘空间不足。点击一看,电脑c盘空间已经爆满变红。当出现这种情况时,很多电脑的运行速度会大大降低,甚至导致部分应用无法正常运行。那么电脑c盘满了怎么清理?如何释放电脑c盘空…

C语言:关键字----switch、case、default(开关语句)

C语言:基础开发----目录 C语言:关键字—32个(分类说明) 有32个关键字详细说明,还有跳转链接! 一、开关语句----介绍 开关语句,包括以下四种关键字: switch:开关语句case: 开关语句…

【vim】系统剪切板、vim寄存器之间的复制粘贴操作命令?系统剪切板中的内容复制粘贴到命令行?vim文本中复制粘贴到命令行

一、系统剪切板和文本内容的复制粘贴 1.1 从系统剪切板复制粘贴到文本中 需要操作3次: 分别是英文双引号、一个加号或梅花号,最后是一个p 也即"p 或者直接使用组合键【Shift insert】 1.2 从文本复制粘贴到系统剪切板 也需要操作3次&#xff…

java EE初阶 — 计算机工作原理

文章目录1.操作系统2.操作系统的定位3.进程3.1 进程的基本了解3.2 操作系统内核是如何管理软件资源的3.3 PCB里描述了进程的哪些特征3.3.1 三个较为简单的特征3.3.2 进程的调度属性4.内存管理1.操作系统 操作系统是一个搞管理的软件。 对上要给软件提供稳定的运行环境。对下要…

基于JAVA的鲜花店商城平台【数据库设计、源码、开题报告】

数据库脚本下载地址: https://download.csdn.net/download/itrjxxs_com/86427660 摘要 在互联网不断发展的时代之下,鲜花软件可以为鲜花企业带来更多的发展机会,让企业可以挖掘到更多的潜在用户,同时结合企业的优势就能够为用户…

Swin Transformer目标检测实验——环境配置的步骤和避坑

Swin Transformer1. 网上基础教程(带视频讲解)2. 配置虚拟环境时遇到的一些问题(按操作顺序排列)1. 网上基础教程(带视频讲解) 大家是不是都从b站来的呀,先给你们基础环境的配置和搭配的视频教…

黑马点评--Redis消息队列

Redis消息队列 Redis消息队列实现异步秒杀 消息队列(Message Queue),字面意思就是存放消息的队列。最简单的消息队列模型包括3个角色: 消息队列:存储和管理消息,也被称为消息代理(Message Br…

【附源码】计算机毕业设计JAVA疫情下的居民管理系统

【附源码】计算机毕业设计JAVA疫情下的居民管理系统 目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: JAVA…

蒙泰转债上市价格预测

蒙泰转债基本信息转债名称:蒙泰转债,评级:A,发行规模:3.0亿元。正股名称:蒙泰高新,今日收盘价:31.3,转股价格:26.15。当前转股价值 转债面值 / 转股价格 * 正…

有没有把语音转为文字的软件?这几个转换软件你值得收藏

我们在日常的工作和生活中,应该经常会遇到需要将音频转换成文字的情况吧。相信大部分的小伙伴都会选择直接使用转换软件进行音频转文字的操作,但在使用的过程中就会发现,有些软件会在使用次数、音频时长上面有所限制,导致我们会转…

《从零开始:机器学习的数学原理和算法实践》chap1

《从零开始:机器学习的数学原理和算法实践》chap1 学习笔记 文章目录《从零开始:机器学习的数学原理和算法实践》chap1 学习笔记chap1 补基础:不怕学不懂微积分1.1 深入理解导数的本质直观理解复合函数求导1.2 理解多元函数偏导1.3 理解微积分…

【附源码】计算机毕业设计JAVA疫情下智慧社区系统

【附源码】计算机毕业设计JAVA疫情下智慧社区系统 目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: JAVA …

CorelDRAW2023最新版矢量设计软件

CorelDRAW2023最新版是我比较用的比较好的一款软件,因为其作为一款优秀的矢量设计软件,兼具功能和性能,它是由Corel公司出品的矢量设计工具,被广泛应用于排版印刷、矢量图形编辑、网页设计等行业。CDR软件的优势在于:易…

studio3T import a SQL Database to Mongodb(从mysql中导入数据到mongodb)

具体参考studio3T官方文档:Import a SQL Database to MongoDB in 5 Steps | Studio 3T 1、打开SQL Migration-->选择SQL to MongoDB Migration 2、创建源数据库的连接(本文源数据库是mysql) 3、选择目标数据库 默认选择当前连接的数据库…

深度学习入门(6)误差反向传播基础---计算图与链式法则

在我的第三篇博文《深度学习入门(3)神经网络参数梯度的计算方式》中详细介绍了通过微分方式计算神经网络权重参数的梯度。但是数值微分的方式计算梯度效率较低。后续博文会介绍另外一种更加高效的梯度计算方式---误差的反向传播。 这篇文章介绍的是误差…

新知实验室 腾讯云实时音视频 RTC WEB端初识

这里写目录标题前言初识产品产品介绍基础功能高级功能扩展功能快速上手位置创建源码下载源码文档写入密钥使用调试区域前言 当前时代是信息行业飞速发展的时代,万物都在朝物联网方向转化。而人作为一个意识体,也正在通过互联网,认识一个全新…