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

news2025/7/6 21:00:36

类加载过程

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

加载(加载字节码文件,生成.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.coloradmin.cn/o/1103602.html

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

相关文章

【学习笔记】RabbitMQ04:延迟队列的原理以及实现代码

参考资料 RabbitMQ官方网站RabbitMQ官方文档噼咔噼咔-动力节点教程 文章目录 七、延迟队列7.1 什么是延迟队列7.2 延迟队列的解决方案7.2.1 定时任务7.2.2 **被动取消**7.2.3 JDK的延迟队列7.2.3 采用消息中间件(rabbitMQ7.2.3.1 适用专门优化后的死信队列实现延迟队…

防火墙规则顺序解决方案

防火墙是保护网络免受攻击的第一道防线,防火墙对互联网和公司IT网络之间的流量拥有绝对控制权,防火墙规则的配置处理调节流量的关键任务。 这些规则会仔细检查传入和传出流量,并根据规则中提到的条件允许或阻止它,防火墙规则越严…

leetCode 5. 最长回文子串 动态规划 + 优化空间 / 中心扩展法 + 双指针

5. 最长回文子串 - 力扣(LeetC5. 最长回文子串 - 力扣(LeetCode)5. 最长回文子串 - 力扣(LeetC 给你一个字符串 s,找到 s 中最长的回文子串。如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。…

制造企业如何做好MES管理系统需求分析

随着制造业的不断发展,制造企业对于生产过程的管理需求日益增长。为了提高生产效率和质量,越来越多的制造企业开始关注MES生产管理系统的需求分析。本文将从以下几个方面探讨制造企业如何做好MES管理系统需求分析。 一、明确需求 在进行MES管理系统需求…

利用PHP快速抓取音频数据的方法与技巧

目录 使用cURL库抓取音频数据 优点 潜在问题及解决方案 使用file_get_contents函数抓取音频数据 优点 潜在问题及解决方案 总结 随着互联网的发展,音频内容在网络上的应用越来越广泛,如音乐播放、语音通信等。有时,我们需要从特定的音…

电脑缺失dll文件有什么办法快速解决,dll文件是什么

玩游戏时经常会出现dll文件缺失,那么dll文件是什么?都有哪些办法可以解决dll文件缺失?今天就带大家了解dll文件以及解决dll文件缺失的办法,看完这篇文章相信你会有很大收获,接下来往下看。 一.Dll文件 Dll文件是VC运…

互联网Java工程师面试题·Java 总结篇·第二弹

目录 12、用最有效率的方法计算 2 乘以 8? 13、数组有没有 length()方法?String 有没有 length()方法? 14、在 Java 中,如何跳出当前的多重嵌套循环? 15、构造器(constructor)是否可被重写&…

汽车安全的未来:毫米波雷达在碰撞避免系统中的角色

随着科技的飞速发展,汽车安全系统变得愈加智能化,而毫米波雷达技术正是这一领域的亮点之一。本文将深入探讨毫米波雷达在汽车碰撞避免系统中的关键角色,以及其对未来汽车安全的影响。 随着城市交通的拥堵和驾驶环境的变化,汽车安全…

腾讯云入选挑战者象限,2023 Gartner容器管理魔力象限发布

10月17日,记者获悉,腾讯云入围在Gartner刚刚发布的2023《容器管理魔力象限》报告(Magic Quadrant™ for Container Management)中,并位列挑战者象限,执行力维度排名国内第二。 Gartner的魔力象限报告是业界…

Spring: 通过注解获取Bean对象

目录 一, 属性注入 属性注入的优点: 属性注入的缺点 二. Setter注入 Setter注入的优点: Setter注入的缺点: 三, 构造方法注入 (主流方式) 构造方法注入的优点 构造方法注入的缺点 四, Autowired与Resource区别 获取Bean对象也叫对象注入(对象装配), 指把对象取出来放…

阿里云starrocks监控告发至钉钉群

背景:新入职一家公司,现场没有对sr的进行监控,根据开发的需求编写了一个python脚本。 脚本逻辑:抓取sr的be/fe/routine load状态信息,判读是否触发告警,若满足告警条件,则发送告警信息到钉钉群…

C# GFPGAN 图像(人脸面部)修复

效果 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.Windows.Forms;namespace 图像修复 {pu…

小程序首页搭建

小程序首页搭建 1. Flex布局是什么?2. 容器的属性2.1 flex-direction属性2.2 flex-wrap属性2.3 flex-flow属性2.4 justify-content属性2.5 align-items属性2.6 align-content属性 二.首页布局搭建二.1moke模拟数据实现轮播图4.信息搭建 Flex弹性布局 1. Flex布局是…

iperf3交叉编译

简介 iperf3是一个用于执行网络吞吐量测量的命令行工具。它支持时序、缓冲区、协议(TCP,UDP,SCTP与IPv4和IPv6)有关的各种参数。对于每次测试,它都会详细的带宽报告,延迟抖动和数据包丢失。 如果是ubuntu系…

[ConvNet]卷积神经网络概念解析

在初步接触了深度学习以后,我们把目光投向对于一些图像的识别。 其实在d2l这本书中,我们接触过用深度神经网络去识别一个图像,并且对其进行一个分类操作,核心原理是将图像展开成一维tensor,然后作为特征进行检测。 其…

JAVA基础(JAVA SE)学习笔记(二)变量与运算符

前言 1. 学习视频: 尚硅谷Java零基础全套视频教程(宋红康2023版,java入门自学必备)_哔哩哔哩_bilibili 2023最新Java学习路线 - 哔哩哔哩 正文 第一阶段:Java基本语法 1. Java 语言概述 JAVA基础(JAVA SE)学习…

源码解析flink文件连接源TextInputFormat

背景: kafka的文件系统数据源可以支持精准一次的一致性,本文就从源码看下如何TextInputFormat如何支持状态的精准一致性 TextInputFormat源码解析 首先flink会把输入的文件进行切分,分成多个数据块的形式,每个数据源算子任务会被分配以读取…

【面试经典150 | 区间】插入区间

文章目录 Tag题目解读题目来源解题思路方法一:合并区间方法二:模拟 其他语言python3 写在最后 Tag 【模拟】【数组】 题目解读 给定一个含有多个无重叠区间的数组,并且数组已经按照区间开始值升序排序。在列表中插入一个新的区间&#xff0…

unity动画_UI动画案例 c#

首先我们打开一个项目 在这个初始界面我们需要做一些准备工作 创建基础通用包 在场景上创建一个Cube 选中Cube 在Window下点击Animation拖拽至运行窗口 点击创建 保存后 这个操作是给Cube添加了一个组件 对Cube_添加一个Position动画 设置几个帧位置的坐标(x,y,z)值 点击运行测…

PHP 如何查看php函数源码

一、在git找到php对应的版本 找到对应的分支版本可以下载也可以在线直接查看 通过这个地址 https://github.com/php/php-src 二、下面已shuffle函数举例,版本为7.4 找到对应的版本进入 点击ext,这个文件夹里面是存放函数的目录 在文件夹里搜不到stu…