【JVM】 类加载机制、类加载器、双亲委派模型详解

news2025/1/12 15:51:09

文章目录

  • 前言
  • 一、类加载机制
  • 二、类加载器
  • 三、双亲委派模型
  • 总结


前言

📕各位读者好, 我是小陈, 这是我的个人主页
📗小陈还在持续努力学习编程, 努力通过博客输出所学知识
📘如果本篇对你有帮助, 烦请点赞关注支持一波, 感激不尽
📙 希望我的专栏能够帮助到你:
JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管理系统等
Java数据结构: 顺序表, 链表, 堆, 二叉树, 二叉搜索树, 哈希表等
JavaEE初阶: 多线程, 网络编程, TCP/IP协议, HTTP协议, Tomcat, Servlet, Linux, JVM等(正在持续更新)


提示:是正在努力进步的小菜鸟一只,如有大佬发现文章欠佳之处欢迎批评指点~ 废话不多说,直接上干货!

一、类加载机制

类加载是指:把 .class 文件加载到内存, 得到类对象的过程
类加载被分为 5 个步骤:

  • 1, 加载(Loading): 查找并加载这个类的二进制文件(.class文件), 并读取文件内容
  • 2, 验证(Verification): 验证这个二进制文件是否符合《Java虚拟机规范》, 是否有正确的文件格式、是否有正确的访问权限等
    这一阶段的目的是确保 Class 文件的字节 流中包含的信息符合《Java虚拟机规范》的全部约束要求,保证这些信 息被当作代码运行后不会危害虚拟机自身的安全
  • 3, 准备(Preparation): 给类对象(静态变量)分配内存空间, 此时的静态变量都是默认值
  • 4, 解析(Preparation): 将常量池内的符号引用替换为直接引用的过程, 也就是初始化常量的过程

这些常量在.class文件中存在时, 只知道相互之间的相对位置, 并不知道在内存中的实际位置, 这时候的常量就是“符号引用”, 加载到内存中后, 这些常量有了自己的内存地址(相对位置不变), 此时的常量就是直接引用

  • 5, 初始化(Initialization): 真正开始执行类中编写的 Java 程序初始化的代码, 将主导权移交给应用程序, 初始化阶段就是执行类构造器方法的过程(初始化静态成员, 执行静态代码块, 如果有父类就去加载父类)

什么时候进行类加载?
并非是JVM一致性, 就把程序中所有的类都加载, 而是非必要不加载, 类似于懒汉模式, 以下三种情况会触发类加载 :

  • 1, 创建了这个类的实例
  • 2, 调用这个类的静态方法
  • 3, 创建了子类的实例 / 调用了子类的静态方法, 会加载当前(父)类

二、类加载器

类加载器(Class Loader)是 Java 虚拟机(JVM)的重要组成部分, 负责将字节码文件加载到内存中并转换为可执行的类
类加载器分为三种 :

  • 启动类加载器(Bootstrap Class Loader):它是 JVM 的内部组件,负责加载 Java 核心类库(如java.lang) 和其他被系统类加载器所需要的类。启动类加载器是由 JVM 实现提供的,通常使用本地代码来实现
  • 扩展类加载器(Extension Class Loader):负责加载 Java 的扩展类库(如 java.util、java.net)等
  • 系统类加载器(System Class Loader):负责加程序员自己写的类以及第三方库中的类

其实还有第四种: 自定义类加载器, 此处就不讨论了


三、双亲委派模型

双亲委派模型是类加载机制中第一步: 查找 .class 文件的过程

具体来说: 如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到最顶层的启动类加载器中,只有当父加载器反馈自己无法完成这个加载请求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去完成加载
在这里插入图片描述

双亲委派模型的优点:

  • 避免重复加载类:比如 A 类和 B 类都有一个父类 C 类,那么当 A 启动时就会将 C 类加载起来,那么在 B 类进行加载时就不需要在重复加载 C 类了
  • 安全性:使用双亲委派模型也可以保证了 Java 的核心 API 不被篡改,如果没有使用双亲委派模型,而是每个类加载器加载自己的话就会出现一些问题,比如我们编写一个称为 java.lang.Object 类的话,那么程序运行的时候,系统就会出现多个不同的 Object 类,而有些 Object 类又是用户自己提供的,因此安全性就不能得到保证了

总结

本篇主要介绍了JVM 中的类加载机制, 分为加载, 验证, 准备, 解析, 初始化五步

在第一步 “加载” 中, 涉及到了 “双亲委派模型” , 而这又建立在三层类加载器的基础上

如果本篇对你有帮助,请点赞收藏支持一下,小手一抖就是对作者莫大的鼓励啦😋😋😋~


上山总比下山辛苦
下篇文章见

在这里插入图片描述

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

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

相关文章

Foxit PDF

Foxit PDF 福昕PDF 软件,可以很好的编辑PDF文档。 调整PDF页面大小 PDF文档中,一个页面大,一个页面小 面对这种情况,打开Foxit PDF 右键单击需要调整的页面,然后选择"调整页面大小". 可以选择…

【网络安全-sql注入(5)】sqlmap以及几款自动化sql注入工具的详细使用过程

一,sqlmap 工具的详细使用 kali系统自带这个工具,无需安装直接sqlmap 后面接参数使用 Windows上参照以下方法安装即可 1-1 工具下载 1-1-1 sqlmap下载 sqlmap 工具下载地址: GitHub - sqlmapproject/sqlmap: Automatic SQL injection a…

【C语言】【动态内存管理】malloc,free,calloc,realloc

1.malloc函数 void* malloc(size_t size)功能&#xff1a;向内存申请字节为 size大小的空间 使用时要包含头文件&#xff1a;<stdlib.h> 开辟成功&#xff1a;返回开辟好的空间初始地址的指针 开辟失败&#xff1a;返回空指针 NULL 使用举例&#xff1a; (malloc和free…

Win10系统中GPU深度学习环境配置记录

运行环境 系统&#xff1a;Win10 处理器 Intel(R) Core(TM) i7-9700K CPU 3.60GHz 3.60 GHz 机带 RAM 16.0 GB 设备 ID A18D4ED3-8CA1-4DC6-A6EF-04A33043A5EF 产品 ID 00342-35285-64508-AAOEM 系统类型 64 位操作系统, 基于 x64 的处理器 显卡&#xff1a;NVIDIA GeF…

快速上手Apache POI

哈喽~大家好&#xff0c;这篇我们来看看快速上手Apache POI。 &#x1f947;个人主页&#xff1a;个人主页​​​​​ &#x1f948; 系列专栏&#xff1a;【日常学习上的分享】 &#x1f949;与这篇相关的文章&#xff1a; Red…

你写过的最蠢的代码是?——一起探讨编程的奇葩时刻

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页: &#x1f405;&#x1f43e;猫头虎的博客&#x1f390;《面试题大全专栏》 &#x1f995; 文章图文并茂&#x1f996…

常见web信息泄露

一、源码(备份文件)泄露 1、git泄露 Git是一个开源的分布式版本控制系统&#xff0c;在执行git init初始化目录的时候&#xff0c;会在当前目录下自动创建一个.git目录&#xff0c;用来记录代码的变更记录等。发布代码的时候&#xff0c;如果没有把.git这个目录删除&#xff…

CCF CSP认证 历年题目自练 Day20

题目一 试题编号&#xff1a; 201903-1 试题名称&#xff1a; 小中大 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 512.0MB 问题描述&#xff1a; 题目分析&#xff08;个人理解&#xff09; 常规题目&#xff0c;先看输入&#xff0c;第一行输入n表示有多少数字&am…

Rabbitmq安装-docker版

1.简介 2.安装消息队列 下载地址https://www.rabbitmq.com/download.html 使用docker方式安装 需要先下载docker&#xff0c;参考文章https://blog.csdn.net/weixin_43917045/article/details/104747341?csdn_share_tail%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22arti…

基于SSM在线医疗服务系统+jsp【附开题|万字文档(LW)和搭建文档】

主要功能 前台登录&#xff1a; 注册用户&#xff1a;用户名、密码、姓名、联系电话 注册医生&#xff1a;医生工号、密码、医生姓名、职称、联系电话、邮箱 用户&#xff1a; ①首页、药品推荐、新闻资讯、健康资讯展示 ②医生坐诊、个人介绍、评价、预约挂号、点我收藏、药品…

实现map和set

map和set的底层就是红黑树&#xff0c;所以只要实现了红黑树&#xff0c;就可以考虑封装出map和set。所以本文会重点介绍我是如何一步步封装map和set&#xff0c;就不会再介绍红黑树的实现&#xff0c;实现可看我上篇博客&#xff0c;个人觉得封装中最麻烦的就是模板参数和迭代…

linux系统的启动流程

目录 简述linux的启动流程 git简介 Linux文件 Ubuntu文件汇总 linux文件属性 Linux命令行 更换软件源 简述linux的启动流程 韦东山课程学习路线&#xff1a;APP应用--DEV驱动--项目。 百问网官网 git资料&#xff1a;https://e.coding.net/weiongshan/01_all_series_qu…

来看看这个JS题输出什么?教你通过断电调试一步步看原因

&#x1f3b6;让我们调试看看这段代码 var foo { n: 1 };(function (foo) {console.log(foo.n) foo.n 3var foo { n: 2 }foo.n 4console.log(foo.n)})(foo)console.log(foo.n);&#x1f367;输出结果 &#x1f3a1;调试解析 &#x1f389;第一步 &#x1f38f;第二步 ✨第…

新一代网络框架UringNet,基于最新的异步I/O

介绍 在去年的一篇文章中&#xff0c;笔者曾经提到了最新一代的网络I/O框架UringNet。具体内容可以参考Rings’ Power,性能“世界第一”的Web I/O框架。这是基于最新Linux内核的异步I/O组件io_uring开发的网络框架。由于采用了最新的异步框架&#xff0c;因此在同等硬件配置条件…

五款可替代163邮箱的电子邮件服务

在众多邮箱品牌中&#xff0c;163邮箱作为中国最早的邮箱服务提供商之一&#xff0c;其出海之路并不顺利。本文将探讨163邮箱出海的劣势&#xff0c;并介绍一些替代品&#xff0c;以帮助用户更好地选择适合自己的邮箱服务。 “163邮箱的替代品有哪些&#xff1f;外贸行业适合选…

指针详解第二部分

目录 1. 数组名的理解 2. 使⽤指针访问数组 3. ⼀维数组传参的本质 4. 冒泡排序 5. ⼆级指针 6. 指针数组 7. 指针数组模拟⼆维数组 1. 数组名的理解 首先先看一个代码 #include <stdio.h> int main() {int arr[10] { 1,2,3,4,5,6,7,8,9,10 };printf("&a…

Java8 Lambda.stream.sorted() 方法使用浅析分享

文章目录 Java8 Lambda.stream.sorted() 方法使用浅析分享sorted() 重载方法一升序降序 sorted() 重载方法二升序降序多字段排序 mock代码 Java8 Lambda.stream.sorted() 方法使用浅析分享 本文主要分享运用 Java8 中的 Lambda.stream.sorted方法排序的使用&#xff01; sorted…

UE 4.27.2 和 UE 5.3.1 自定义模块出现的问题

目录 UE4.27.2 和 UE5.3.1 自定义模块的区别无法打开 uproject&#xff0c;无法使用 uproject 右键菜单重建 vs 项目时&#xff0c;怎么重建 vs 项目创建 Module 需要注意的地方为什么是 Modules/ModuleManager.h为什么 UE 5.3.1 报错找不到 Modules/ModuleManager.h怎么验证自…

初识jdbc

java中的数据存储技术 在Java中&#xff0c;数据库存取技术可分为如下几类&#xff1a; JDBC直接访问数据库 JDO (Java Data Object )技术 第三方O/R工具&#xff0c;如Hibernate, Mybatis 等 JDBC是java访问数据库的基石&#xff0c;JDO、Hibernate、MyBatis等只是更好的封…

大数据-玩转数据-双流JOIN

一、双流JOIN 在Flink中, 支持两种方式的流的Join: Window Join和Interval Join 二、Window Join 窗口join会join具有相同的key并且处于同一个窗口中的两个流的元素. 注意: 1.所有的窗口join都是 inner join, 意味着a流中的元素如果在b流中没有对应的, 则a流中这个元素就不会…