类加载的过程总结以及双亲委派模型[JVM]

类加载过程

类一共有七个生命周期:加载->验证->准备->解析->初始化->使用->卸载
在这里插入图片描述

加载(加载字节码文件,生成.class对象)

加载是类加载的第一个阶段。 加载阶段的任务是在类文件从磁盘加载到内存中,通常是从classpath中的jar文件或目录中加载。
加载过程不仅仅包括类的字节码,还包括了静态变量(常量池中的常量值)和静态方法(类中的静态方法)的定义。

验证(验证Class文件是否符合规范)

验证是确保类文件的完整性和合法性的过程。
验证器检查类文件是否符合Java虚拟机规范,包括检查字节码的格式、语义等,以防止恶意代码执行。
验证确保了Java程序的安全性。

准备(为静态变量分配内存并设置变量初始值)

准备阶段为类的静态变量分配内存,并为这些变量设置初始值。
这里的初始值通常是零值(zero value),如整数为0,引用为null等。
准备并不包括执行类构造器(类的静态初始化方法),仅分配内存并设置初始值。

解析(初始化常量池中的一些常量)

解析是可选的,它将符号引用解析为直接引用。
在解析过程中,虚拟机将类、方法、字段等符号引用映射到具体的内存地址。
解析通常发生在类的初始化阶段之前。

初始化(初始化对象,并为静态变量赋值)

初始化是类加载过程的最后一步。 在初始化阶段,虚拟机执行类构造器方法,它包括了对类的静态字段进行初始化、静态块的执行等。
初始化是类加载的触发点,当第一次使用一个类(例如,创建对象、调用静态方法、访问静态字段)时,该类将被初始化。

总结一下,类加载过程经历了加载、验证、准备、解析和初始化五个阶段,这些阶段确保了类的正确加载和初始化,同时维护了Java程序的安全性。初学者应该理解这些阶段的作用,以更好地理解Java类加载和运行过程。

类加载器

JVM预定义加载器主要有三种:

启动类加载器(bootstrap class loader)

是加载Java运行时所需的基础类的特殊类加载器。它是JVM内置的类加载器,负责加载JVM运行时必需的核心类库,这些类库包括Java平台类库(Java
API,如java.lang包)以及其他基础组件。

扩展类加载器(Extension ClasLoader)

是Java虚拟机(JVM)的一个内置类加载器,它的主要任务是加载Java标准扩展(Java
Extension)中的类库,这些类库通常位于JRE目录下的lib/ext目录中。扩展类加载器是Java类加载层次中的第二级加载器,其加载范围在类加载层次中位于启动类加载器和应用程序类加载器之间。

应用程序类加载器(系统类加载器)

是Java虚拟机(JVM)的一种内置类加载器,也被称为系统类加载器(System Class Loader)。它是Java类加载层次结构中的最底层加载器,负责加载应用程序中的类.

类加载机制

JVM的类加载机制主要有如下3种

全盘负责

当一个类加载器负责加载某个Class时,该Class所依赖和引用其他Class也将由该类加载器负责载入,除非显示使用另外一个类加载器来载入。

双亲委派

先让父类加载器试图加载改Class,只有在父类加载器无法加载该类时才尝试从自己的类路径中加载该类,依次向上找.
在这里插入图片描述
双亲委派的优点(安全稳定):
1.当一个类收到类加载请求时,他首先不自己尝试去加载,而是层层向上委派给自己的父类,每一层加载器都如此,因此所有的请求都应该传送到启动类加载器中。
2.具备了带有优先级的层次关系,通过层级关系避免类的重复加载,最主要的为了安全,java核心api中定义的类型不会被随意篡改。
3.打破双亲委派模型:
打破双亲委派机制则不仅要继承ClassLoader类,还要重写loadClass和findClass方法。

缓存机制

缓存机制将会保证所有加载过的Class都会被缓存,当程序中需要使用某个Class时,类加载器先从缓存区中搜寻该Class,只有当缓存区中不存在该Class对象时,系统才会读取该类对应的二进制数据,并将其转换成Class对象,存入缓冲区中。这就是为什么修改了Class后,必须重新启动JVM,程序所做的修改才会生效的原因。

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

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

相关文章

Aroid问题笔记 - ViewPager嵌套RecyclerView,降低ViewPager灵敏度

点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册点击跳转>Scratch编程案例点击跳转>软考全系列 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&…

【网络协议】聊聊DHCP和PXE 工作原理

DHCP 动态主机配置协议 对于每个主机来说,只要连接了网络,那么就会配置一个IP地址,那么这个IP地址,如果是手动配置的话,对于公司内部的人员来说都要找IT进行配置,这个太浪费人力物力了,所以解决…

React18入门(第四篇)——React中的4种CSS使用方式,CSS Module、CSS-in-Js详解

文章目录 一、普通方式使用CSS1.1 元素内联 style1.2 引入 CSS 文件1.3 类名插件 -- Classnames1.4 注意事项 二、CSS Module2.1 普通 CSS 的问题2.2 CSS Module 的特点2.3 简单使用 三、使用 sass3.1 sass 简介3.2 使用 四、CSS-in-JS4.1 CSS-in-JS 简介4.2 CSS-in-JS 常用工具…

【JVM】对象内存布局

对象内存布局 文章目录 对象内存布局1. 对象的内存布局2. 对象标记(Mark Word)3. 类元信息(类型指针)4. 实例数据和对象填充 1. 对象的内存布局 在Hotspot虚拟机里,对象在堆内存中的存储布局可以划分为三个部分:对象头(Header)、实例数据(Instance Data…

SpringBoot面试题5:SpringBoot Starter的工作原理是什么?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:SpringBoot Starter的工作原理是什么? Spring Boot Starter 是一种便捷的方式来为 Spring Boot 应用程序引入一组特定功能的依赖项。它简化了项目…

Kotlin注释

一、设置注释样式 按需配置 二、单行多行注释 fun main() {// 单行注释println("单行注释") //单行注释/** 多行注释* */println("多行注释") }

ELK + Filebeat 分布式日志管理平台部署

ELK Filebeat 分布式日志管理平台部署 1、前言1.1日志分析的作用1.2需要收集的日志1.3完整日志系统的基本特征 2、ELK概述2.1ELK简介2.2为什么要用ELK?2.3ELK的组件 3、ELK组件详解3.1Logstash3.1.1简介3.1.2Logstash命令常用选项3.1.3Logstash 的输入和输出流3.1.4Logstash配…

密码学三 btc 钱包 节点 挖矿 51%攻击 双花攻击

03-BTC-数据结构_哔哩哔哩_bilibili 哈希指针并解释 比特币的每个区块都包含一个区块头和区块体两部分。 在区块头中,有一个字段是用于存储前一个区块的哈希值,我们把这个存储前一个区块哈希值的字段称为“哈希指针”。 这个哈希指针的作用是将本区块指向前一个区块,连接起整…

CentOS有IP地址,连接不上Xshell或使用Xshell时突然断开

问题原因:未在电脑主机的网络中进行IP地址配置 解决办法: 1.打开控制面板,选择‘网络与共享中心’ 2.选择“更改适配器设置” 3.右键点击以太网3“属性” 4.选择协议版本4,点击属性 5.IP地址填写CentOS的IP地址:192.…

Epoch、批量大小、迭代次数

梯度下降 它是 机器学习中使用的迭代 优化算法,用于找到最佳结果(曲线的最小值)。 坡度 是指 斜坡的倾斜度或倾斜度 梯度下降有一个称为 学习率的参数。 正如您在上图(左)中看到的,最初步长较大&#…

SpringBoot基础详解

目录 SpringBoot自动配置 基于条件的自动配置 调整自动配置的顺序 纷杂的SpringBoot Starter 手写简单spring-boot-starter示例 SpringBoot自动配置 用一句话说自动配置:EnableAutoConfiguration借助SpringFactoriesLoader将标准了Configuration的JavaConfig类…

微信小程序中如何使用fontawesome6的免费图标

一、官网下载fontawesome6 Download Font Awesome Free or Pro | Font Awesome 二、使用transfer编码成Base64 transfer打开官网:Online font-face generator — Transfonter 首先先把刚刚下载的fontawesome6解压,将文件夹中的字体上传(点…

java入参为对象的(非基本数据类型int/float等)修改属性会影响原始对象

ApiOperation("登录接口")RequestMapping(value "/login", method RequestMethod.POST)public Result<JSONObject> login(RequestBody SysLoginModel sysLoginModel){Result<JSONObject> result new Result<JSONObject>();// by wang…

禁用和开启笔记本电脑的键盘功能,最快的方式

笔记本键盘通常较小&#xff0c;按键很不方便&#xff0c;当我们外接了键盘时就不需要再使用自带的键盘了&#xff0c;而且午睡的时候&#xff0c;总是担心碰到笔记本的键盘&#xff0c;可能会删掉我们的代码什么的&#xff0c;所以就想着怎么禁用掉&#xff0c;下面是操作步骤…

面向切面:AOP

文章目录 简介相关术语①横切关注点②通知&#xff08;增强&#xff09;③切面④目标⑤代理⑥连接点⑦切入点 场景模拟代理模式静态代理动态代理 基于注解的AOP&#xff08;重点&#xff09;准备工作各种通知切入点表达式语法重用切入点表达式获取通知的相关信息 环绕通知 切面…

分类算法-逻辑回归与二分类

1、逻辑回归的应用场景 广告点击率是否为垃圾邮件是否患病金融诈骗虚假账号 看到上面的例子&#xff0c;我们可以发现其中的特点&#xff0c;那就是都属于两个类别之间的判断。逻辑回归就是解决二分类问题的利器。 2、 逻辑回归的原理 2.1 输入 逻辑回归的输入就是一个线性…

HarmonyOS/OpenHarmony原生应用开发-华为Serverless服务支持情况(四)

文档中的TS作者认为就是ArkTS之意。 一、云存储 AppGallery Connect&#xff08;简称AGC&#xff09;云存储是一种可伸缩、免维护的云端存储服务&#xff0c;可用于存储图片、音频、视频或其他由用户生成的内容。借助云存储服务&#xff0c;您可以无需关心存储服务器的开发、…

Python自动化运维实战——Telnetlib和Netmiko自动化管理网络设备

❤️博客主页&#xff1a; iknow181&#x1f525;系列专栏&#xff1a; Python、JavaSE、JavaWeb、CCNP&#x1f389;欢迎大家点赞&#x1f44d;收藏⭐评论✍ 目录 一、前言 二、准备工作 三、Telnetlib Telnetlib介绍 Telnetlib模块及操作方法介绍 Telnetlib配置设备 T…

uniapp:使用subNVue原生子窗体在map上层添加自定义组件

我们想要在地图上层添加自定义组件&#xff0c;比如一个数据提示框&#xff0c;点一下会展开&#xff0c;再点一下收起&#xff0c;在h5段显示正常&#xff0c;但是到app端真机测试发现组件显示不出来&#xff0c;这是因为map是内置原生组件&#xff0c;层级最高&#xff0c;自…

从0开始编写BP,自适应学习率的BP神经网络,不使用MATLAB工具箱,纯手写matlab代码,以BP分类为例...

与上篇文章不同&#xff0c;仔细读了上篇文章的小伙伴应该知道&#xff0c;BP神经网络是有一个学习率的&#xff0c;而这个学习率很大程度上决定着神经网络的效果。这里采用自适应学习率&#xff0c;实现纯手写BP神经网络。 编程时&#xff0c;激活函数选择Sigmoid函数&#xf…