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

news2025/8/8 15:32:29

系列文章目录

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.coloradmin.cn/o/34304.html

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

相关文章

MyBatis-核心配置文件mybatis-config.xml主要参数详解

1.全局配置文件 全局配置文件,见名知意就是对当前MyBatis的一些全局属性进行设置。也就是对各种数据操作进行统一规定。 全局配置文件包含了全局设置(setting)和properties两个大的部分,通过这两个大的部分动态的影响MyBatis的行…

安装Centos7

大部分运行环境都是centos,自己最近装了太多次centso,记录一下。 目录一、安装VMware二、下载Centos7镜像三、新建虚拟机四、配置Centos4.1 开启虚拟机4.2 配置安装语言4.3 安装图形界面4.4 设置磁盘分区4.5 开启网络4.6 配置root密码一、安装VMware VM…

git学习(一)

git学习之基本配置以及简单推拉操作 1 git的基本配置 1.1 配置提交者的姓名 1.1.1 语法 git config --global user.name "姓名"1.1.2 示例代码 git config --global user.name "张三"1.1.3 示例代码运行截图 1.2 配置提交者的邮箱 1.2.1 语法 git c…

app优化ios,iOS app上架流程问题集锦,ASO新手小白必看(上)

App从研发到提审上架,需要一套流程来保证App质量。而在上架过程中,开发者们往往都会遇到一些问题。今天就上架流程中遇到的问题作简单的梳理~ 1.准备 苹果开发者账号: 美术素材: Icon:尺寸1024*1024 设计icon时&#x…

Socket网络编程

参考博客:https://blog.csdn.net/shuux666/article/details/124023652 1、环境查看 通过cmd窗口的命令:ipconfig查看本机IP地址 查看网络情况是否正常:ping百度官网 2、Socket概述 3、套接字建立连接过程 4、Socket网络编程 基本的Socket编程: 本实…

2023-2028年中国合成氨行业发展前景与投资规划分析报告

本报告由锐观咨询重磅推出,对中国合成氨行业的发展现状、竞争格局及市场供需形势进行了具体分析,并从行业的政策环境、经济环境、社会环境及技术环境等方面分析行业面临的机遇及挑战。还重点分析了重点企业的经营现状及发展格局,并对未来几年…

【网络篇】第十五篇——HTTP协议(二)

HTTP的方法 HTTP的状态码 HTTP常见的Header Cookie和Session HTTP VS HTTPS HTTP/1.1,HTTP/2,HTTP/3演变 前面一章初步认识了URL,HTTP请求和相应协议格式,有所忘记的可以看一下前面的博客 (3条消息) 【网络篇】第十四篇——HTTP协议(一)(附带电视剧…

JVM 的可达性分析法和四种引用

JVM的垃圾回收机制的三个问题 回收哪些数据?什么回收?在哪里回收? 本就回答垃圾回收机制是回收哪些数据? 所谓“要回收的垃圾”无非就是那些不可能再被任何途径所使用的对象。无需再使用的对象,会被标记为垃圾&#…

PDF预览完整解决方案及各种兼容(VUE版)

PDF预览完整解决方案及各种兼容(VUE版) PDF预览完整解决方案及各种兼容(VUE版) - 掘金 前端学习使者正在上传…重新上传取消 2021年11月12日 16:57 阅读 2547 一、利用iframe 就一行代码就够了,只能满足最基本的…

【C++】vector的使用与题目练习

文章目录一、前言二、构造函数三、遍历四、增删查改1.常用接口2.增删查改五、经典题目一、前言 学习完string类之后,我们在来学习vector难度并没有之前那么高,更加容易理解一些接口 vector是表示可变大小数组的序列容器 ,本质讲,v…

【基于stm32 FreeRtos的智能台灯】

基于stm32 FreeRtos的智能台灯控制 之前做了一个裸机版本的智能台灯,最近刚好复习一下FreeRto的一些基础知识,朋友发给了我一个功能需求刚好用来实践一下,需要的朋友可以自行下载。 链接:https://pan.baidu.com/s/1Ovn1ILgvDWWzeC…

Java项目:JSP会议-会议室管理系统

作者主页:源码空间站2022 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目包含两个角色,管理员与用户角色; 管理员角色包含以下功能: 查看预订,查看会议,部门管理,员工注册,添…

Driud数据库连接池的使用

Driud数据库连接池的使用 简介:本文通过简洁的代码,让大家快速熟悉Driud数据库连接池的使用。 数据库连接池简介 数据库连接池是个容器,负责分配、管理数据库连接(Connection) 它允许应用程序重复使用一个现有的数据库连接,而不…

ROS-Unity连接教程

本篇文章主要介绍基于ROS-TCP-Connector、ROS-TCP-Endpoint两个Unity接口与ROS进行通信的环境配置,并对官方给出的Unity和ROS相互通信示例中的消息部分做了说明 一、环境配置 参考:Unity-Robotics-Hub/setup.md at main Unity-Technologies/Unity-Rob…

【机器学习】拟合优度度量和梯度下降(红酒数据集的线性回归模型sklearnRidge)

文章目录一.拟合优度度量(可决系数)1.1总离差平方和的分解1.2 TSSESSRSS1.3 红酒数据集实例R2_score实现代码二. 梯度下降2.1 损失函数直观图(单特征/变量举例)2.2 梯度下降和正规方程的区别2.3 线性回归模型——梯度下降 (红酒数据集&#x…

天宇优配|混动车将告别上海免费绿牌 新能源多种技术路

现在订车还来得及吗?这是上海购置混动新能源车群体当下最关怀的问题。根据方针要求,上海关于混动车的免费绿牌支持将于本年年底结束。这意味着,再过一个多月,在上海购买插电式混合动力(含增程式)轿车将依照…

同事问我为什么上级喊他把js实现改成css

文章目录页面绘制流程CSS3动画优点缺点JS动画优点缺点总结本人不是专门写前端的,所以可能有不合理的地方,建议您多搜几篇博客看一下。页面绘制流程 渲染流程主要有4个步骤 解析 HTML 生成DOM 树解析 CSS 样式生成 CSSOM 树,CSSOM 树与 DOM …

Verilog 条件语句

link 我用的是 vivado 21 秒学会 vivado 仿真 关键词:if,选择器 条件语句 条件(if)语句用于控制执行语句要根据条件判断来确定是否执行。 条件语句用关键字 if 和 else 来声明,条件表达式必须在圆括号中。 条件语句使…

【网络篇】第十六篇——再谈端口号

再谈端口号 端口号范围划分 认识知名端口号 两个问题 netstat pidof 再谈端口号 端口号(Port)标识了一个主机上进行通信的不同的应用程序; 从网络中获取的数据在进行向上交付时,在传输层就会提取出该数据对应的目的端口号,进而确定该数据…

159-170-Hadoop-调优-hdfs-yran-综合

159-Hadoop-调优-hdfs故障排查: HDFS**—故障排除**(此处了解,一般使用HA) NameNode 故障处理 1)需求: NameNode 进程挂了并且存储的数据也丢失了,如何恢复 NameNode 2)故障模拟…