类加载的过程总结以及双亲委派模型[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.rhkb.cn/news/166045.html

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

相关文章

【LCR 170. 交易逆序对的总数】

目录 一、题目描述二、算法原理三、代码实现3.1升序&#xff1a;3.2降序&#xff1a; 一、题目描述 二、算法原理 三、代码实现 3.1升序&#xff1a; class Solution { public:int mergeSort(vector<int>& nums, int left, int right){if (left > right){retur…

mysql varchar int

年龄是数字类型int SELECT * FROM test ORDER BY age; 年龄是字符类型varchar SELECT * FROM test ORDER BY code; 第1种 补前导0可以和数字一样排序 MySQL会比较字符的ASCII值&#xff0c;并根据这些值来确定字符的排列顺序。 印象中oracle好像也是吧。 ASCII (American …

webgl计算包围盒大小

使用three.js&#xff1b; 代码&#xff1b; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>第一个three.js 示例</title><style>body {margin: 0;overflow: hidden;}</style><…

选择什么电容笔比较好?平板手写笔推荐

由于苹果Pencil的热销&#xff0c;让华国内市场上&#xff0c;也出现了不少的平替式电容笔&#xff0c;这些产品&#xff0c;有好有坏&#xff0c;价格也很公道。不过&#xff0c;也有很多产品的价格都很平价。我是一个拥有多年经验的数码发烧友&#xff0c;在前几年就开始用上…

【Django 04】Serialization 序列化的高级使用

序列化器 serializers 序列化器的作用 序列化将 queryset 和 instance 转换为 json/xml/yaml 返回给前端 反序列化与序列化则相反 定义序列化器 定义类&#xff0c;继承自 Serializer 通常新建一个 serializers.py 文件 撰写序列化内容 suah as 目前只支持 read_only 只…

IDEA 新版本设置菜单展开

使用了新版本的IDEA 新UI后&#xff0c;常用的file&#xff0c;view&#xff0c;菜单看不见了&#xff0c;不太适应&#xff0c;找了一下&#xff0c;有个配置可以修改。 打开settings里面把show main menu in a separate toolbar勾选上&#xff0c;应用保存就可以了

线性代数1:线性方程和系统

图片来自施泰德博物馆 Digital Collection (staedelmuseum.de) 一、前言 通过这些文章&#xff0c;我希望巩固我对这些基本概念的理解&#xff0c;同时如果可能的话&#xff0c;通过我希望成为一种基于直觉的数学学习方法为其他人提供额外的清晰度。如果有任何错误或机会需要我…

Java并发编程常见面试题总结

梳理Java并发编程相关的面试题&#xff0c;主要参考《JAVA并发编程实战》(Brian Goetz, Joshua Bloch, David Holmes, Tim Peierls, Joseph Bowbeer, Doug Lea 著, 韩锴, 方妙 译)一书&#xff0c;其余部分整合网络相关内容。注意&#xff0c;关于Java基础相关的面试题可以参考…

数据结构-树的概念结构及存储

&#x1f5e1;CSDN主页&#xff1a;d1ff1cult.&#x1f5e1; &#x1f5e1;代码云仓库&#xff1a;d1ff1cult.&#x1f5e1; &#x1f5e1;文章栏目&#xff1a;数据结构专栏&#x1f5e1; 目录 一、树的基本概念及结构 1树的概念 2树的存储 二、二叉树的概念及结构 1二叉树的概…

什么是t检验?

t检验&#xff08;t-test&#xff09;是一种统计方法&#xff0c;用于比较两组数据之间的平均值是否存在显著差异。它通常用于分析两组样本的平均值是否具有统计学上的显著性差异。t检验基于正态分布的假设&#xff0c;它计算两组数据之间的t值&#xff0c;然后通过与t分布表进…

Android笔记(七)Android JetPack Compose组件搭建Scaffold脚手架

在去年2022年曾发布一篇关于脚手架的文章&#xff1a;“Android JetPack Compose组件中Scaffold的应用” 。但是Android的版本从12变更到13及以上版本&#xff0c;导致一些细节的实现存在不同。在本文中&#xff0c;将从头开始介绍整个脚手架的搭建过程。 一、新建项目模块 在…

安装Docker

本安装教程参考Docker官方文档&#xff0c;地址如下&#xff1a;https://docs.docker.com/engine/install/centos/ 卸载旧版 首先如果系统中已经存在旧的Docker&#xff0c;则先卸载&#xff1a; yum remove docker \ docker-client \ docker-client-latest \ docker-common…

经典题型---旋转数组

经典题型—旋转数组 文章目录 经典题型---旋转数组一、题目二、代码实现 一、题目 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步…

Ubuntu系统下使用docker容器配置nginx并部署前端项目

1.下载 Nginx 镜像 命令 描述 docker pull nginx 下载最新版 Nginx 镜像 :2. 创建要挂载的宿主机目录 启动前需要先创建 Nginx 外部挂载的配置文件&#xff08; /home/nginx/conf/nginx.conf&#xff09; 之所以要先创建 , 是因为 Nginx 本身容器只存在 / etc/nginx 目录 ,…

识别准确率竟如此高,实时语音识别服务

前言 本文将介绍一个准确率非常高的语音识别框架&#xff0c;那就是FunASR&#xff0c;这个框架的模型训练数据超过几万个小时&#xff0c;经过测试&#xff0c;准确率非常高。本文将介绍如何启动WebSocket服务和Android调用这个服务来实时识别&#xff0c;一边说话一边出结果…

计算机毕业设计 基于SpringBoot智慧养老中心管理系统的设计与实现 Javaweb项目 Java实战项目 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

C++:类的默认成员函数------构造函数析构函数(超详细解析,小白一看就懂!)

目录 一、前言 二、为什么会出现构造函数和析构函数 三、构造函数 &#x1f34e;构造函数的概念 &#x1f350;构造函数特性 &#x1f4a6;解释特性3&#xff1a;对象实例化时编译器自动调用对应的构造函数 &#x1f4a6;解释特性4&#xff1a;构造函数支持重载 &…

什么是大数据测试?有哪些类型?应该怎么测?

随着目前世界上各个国家使用大数据应用程序或应用大数据技术场景的数量呈指数增长&#xff0c;相应的&#xff0c;对于测试大数据应用时所需的知识与大数据测试工程师的需求也在同步增加。 针对大数据测试的相关技术已慢慢成为当下软件测试人员需要了解和掌握的一门通用技术。…

YOLOv5改进实战 | 更换主干网络Backbone(四)之轻量化模型MobileNetV3

前言 轻量化网络设计是一种针对移动设备等资源受限环境的深度学习模型设计方法。下面是一些常见的轻量化网络设计方法: 网络剪枝:移除神经网络中冗余的连接和参数,以达到模型压缩和加速的目的。分组卷积:将卷积操作分解为若干个较小的卷积操作,并将它们分别作用于输入的不…

JAVA基础(JAVA SE)学习笔记(六)面向对象编程(基础)

前言 1. 学习视频&#xff1a; 尚硅谷Java零基础全套视频教程(宋红康2023版&#xff0c;java入门自学必备)_哔哩哔哩_bilibili 2023最新Java学习路线 - 哔哩哔哩 第二阶段&#xff1a;Java面向对象编程 6.面向对象编程&#xff08;基础&#xff09; 7.面向对象编程&…