【jvm】类加载子系统

news2025/1/16 2:42:25

目录

        • 一、图
        • 二、类加载器作用
        • 三、类加载器角色
        • 四、类的加载过程
          • 4.1 加载
            • 4.1.1 说明
            • 4.1.2 加载.class文件的方式
          • 4.2 链接
            • 4.2.1 验证(verify [ˈverɪfaɪ])
            • 4.2.2 准备(prepare)
            • 4.2.3 解析(resolve)
          • 4.3 初始化
            • 4.3.1 说明
            • 4.3.2 图示1
            • 4.3.3 图示2
            • 4.3.3 图示3

一、图

在这里插入图片描述

二、类加载器作用

  • 1.类加载器子系统负责从文件系统或者网络中加载class文件
  • 2.class文件在文件开头有特定的文件标识
  • 3.ClassLoader只负责class文件的加载,由Execution Engine(执行引擎)决定是否可以运行
  • 4.加载的类信息存放于方法区的内存空间。
  • 5.方法区除了存放类的信息,还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常量信息是class文件中常量池部分的内存映射)
  • 6.字节码文件中的Constant Pool常量池结构,运行的时候加载到内存里称为运行时常量池

三、类加载器角色

  • 1.class文件存放于本地硬盘上,可以理解为一个模板,这个模板在执行的时候会加载到JVM当中,根据这个模板实例化出多个一模一样的实例
  • 2.class文件加载到JVM中,称为DNA元数据模板,存放在方法区
  • 3.在class文件 -> JVM -> 元数据模板,这个过程需要类加载器来运输

四、类的加载过程

4.1 加载
4.1.1 说明
  • 1.通过一个类的全限定名获取定义此类的二进制字节流
  • 2.将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
  • 3.在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口
4.1.2 加载.class文件的方式
  • 1.从本地系统中直接加载
  • 2.通过网络获取,典型场景:web applet
  • 3.从zip压缩包中获取,成为jar、war格式的基础
  • 4.运行时计算生成,使用最多的是动态代理技术
  • 5.由其它文件生成,使用场景:jsp应用
  • 6.从专有数据库中提取.class文件,比较少见
  • 7.从加密文件中获取,典型的防class文件被反编译的保护措施
4.2 链接
4.2.1 验证(verify [ˈverɪfaɪ])
  • 1.目的在于确保class文件的字节流中包含信息符合当前虚拟机要求,保证被加载类的正确性,不会危害虚拟机自身安全
  • 2.主要包括四种验证,文件格式验证、元数据验证、字节码验证、符号引用验证
4.2.2 准备(prepare)
  • 1.为类变量分配内存并且设置该类变量的默认初始值,即零值
  • 2.不包括用final修饰的static,因为final在编译的时候就会分配,准备阶段会显示初始化
  • 3.不会为实例变量分配初始化,类变量会分配在方法区中,而实例变量是会随着对象一起分配到java堆中
4.2.3 解析(resolve)
  • 1.将常量池内的符号引用转换为直接引用的过程
  • 2.解析操作往往会伴随着jvm在执行完完成初始化之后再执行
  • 3.符号引用是一组符号来描述所引用的目标
  • 4.直接引用是直接指向目标的指针、相对偏移量或一个间接定位到目标的句柄
  • 5.解析动作主要针对类或接口、字段、类方法、接口方法、方法类型等。对应常量池中的constant_class_info、constant_fieldref_info、constant_methodref_info等
4.3 初始化
4.3.1 说明
  • 1.初始化阶段是执行类构造器方法<clinit>()的过程
  • 2.此方法不需要定义,是javac编译器自动收集类中的所有类变量的赋值动作和静态代码块中的语句合并而来
  • 3.构造器方法中指令按语句在源文件中出现的顺序执行
  • 4.<clinit>()不同于类的构造器。(关联:构造器是虚拟机视角下的<init>())
  • 5.若该类具有父类,jvm会保证子类<clinit>()执行前,父类的<clinit>()已经执行完毕
  • 6.虚拟机必须保证一个类的<clinit>()方法在多线程下被同步加锁
4.3.2 图示1
  • 1.当没有类变量和静态代码块时,是没有类构造器方法的
    在这里插入图片描述
    在这里插入图片描述
4.3.3 图示2
  • 1.是javac编译器自动收集类中的所有类变量的赋值动作和静态代码块中的语句合并而来
    在这里插入图片描述
4.3.3 图示3
  • 1.构造器方法中指令按语句在源文件中出现的顺序执行
  • 2.iconst_2之所以能在iconst_3之前成功是因为num在链接准备的过程中,为类变量分配内存并且设置该类变量的默认初始值,即num为零值
    在这里插入图片描述

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

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

相关文章

预测知识 | 神经网络、机器学习、深度学习

预测知识 | 预测技术流程及模型评价 目录 预测知识 | 预测技术流程及模型评价神经网络机器学习深度学习参考资料 神经网络 神经网络&#xff08;neural network&#xff09;是机器学习的一个重要分支&#xff0c;也是深度学习的核心算法。神经网络的名字和结构&#xff0c;源自…

整理mongodb文档:find方法查询数据

个人博客 整理mongodb文档:find方法查询数据 求关注&#xff0c;求批评&#xff0c;求指出&#xff0c;如果哪儿不清晰&#xff0c;请指出来&#xff0c;谢谢 文章概叙 如题&#xff0c;本文讲的是如何用find查询数据&#xff0c;如何在数组、字段、对象中查询&#xff0c;以…

redis学习笔记(八)

文章目录 redis的配置redis的核心配置选项Redis的使用 redis的配置 cat /etc/redis/redis.confredis 安装成功以后,window下的配置文件保存在软件 安装目录下,如果是mac或者linux,则默认安装/etc/redis/redis.conf redis的核心配置选项 绑定ip&#xff1a;访问白名单&#x…

关系型数据库MySQL及其优化

写在前面 本文看下MySQL的基础内容以及常见的优化方式。 1&#xff1a;MySQL基础内容 1.1&#xff1a;什么是关系型数据库 以二维的数据格式来存储数据的数据库叫做关系型数据库&#xff0c;其中关系包括一对一&#xff0c;一对多&#xff0c;多对多&#xff0c;都通过二位…

qt QPalette的原理与使用

QPalette类用于控制控件的风格&#xff0c;即任意一个地方的绘制方式。每个控件或者说qwidget对象内部都有一个QPalette对象。 在paintEvent(QPaintEvent *event)函数中&#xff0c;其实就是调用该控件的QPalette内容来进行绘制的了。 例如&#xff1a; QStyleOptionTab opt…

强化学习算法

强化学习算法 游戏模型如下&#xff1a; 策略网络输入状态s&#xff0c;输出动作a的概率分布如下&#xff1a; π ( a ∣ s ) \pi(a|s) π(a∣s) 多次训练轨迹如下 r表示回报横轴为T, 1个回合的步骤数纵轴为N, 回合数&#xff0c;1行代表1条轨迹&#xff0c;符合概率分布…

DatawhaleAI夏令营第三期机器学习用户新增预测挑战赛baseline新手教程

本教程会带领大家项目制学习&#xff0c;由浅入深&#xff0c;逐渐进阶。从竞赛通用流程与跑通最简的Baseline&#xff0c;到深入各个竞赛环节&#xff0c;精读Baseline与进阶实践技巧的学习。 千里之行&#xff0c;始于足下&#xff0c;从这里&#xff0c;开启你的 AI 学习之旅…

wifi列表消失 后总结

故障现象&#xff1a; 管理源身份打开cmd &#xff0c;然后重启网络服务 Fn 加信号塔 开启二者为自动&#xff1a; 刷新网络&#xff1a; Fn 加信号塔 重启的时间可以放长一些 半个小时左右

【数据结构与算法】十大经典排序算法-选择排序

&#x1f31f;个人博客&#xff1a;www.hellocode.top &#x1f3f0;Java知识导航&#xff1a;Java-Navigate &#x1f525;CSDN&#xff1a;HelloCode. &#x1f31e;知乎&#xff1a;HelloCode &#x1f334;掘金&#xff1a;HelloCode ⚡如有问题&#xff0c;欢迎指正&#…

ping是什么

一.什么是ping 命令 在网络中 ping 是一个十分强大的 TCP/IP 工具,ping是定位网络通不通的一个重要手段。 ping 命令是基于 ICMP 协议来工作的&#xff0c;「 ICMP 」全称为 Internet 控制报文协议&#xff08;Internet Control Message Protocol&#xff09;。ping 命令会发…

恒温碗语音芯片,具备数码管驱动与温度传感算法,WT2003H-B012

近年来&#xff0c;随着科技的飞速发展&#xff0c;智能家居产品已然成为了现代生活的一部分&#xff0c;为人们的生活带来了更多的便利和舒适。在这个不断演进的领域中&#xff0c;恒温碗多功能语音芯片——WT2003H-B012成为众多厂商的首选&#xff0c;为智能家居领域注入了全…

数据库中的连表更新和连表删除

1.连表更新 准备两张表,id一样,但是姓名不一样, 需求根据id让姓名保持一致 执行的sql UPDATE teacher_copy1 AS b INNER JOIN teacher c ON b.TId c.TId set b.tnamec.tname 执行结果 2.连接删除 DELETE a FROMteacher_copy1 AS aINNER JOIN teacher b ON a.TId b.TId

【从零开始学习JAVA | 第四十五篇】动态代理

目录 前言&#xff1a; 动态代理&#xff1a; 动态代理实现步骤&#xff1a; 动态代理的应用场景&#xff1a; 总结&#xff1a; 前言&#xff1a; 动态代理作为一种强大的编程技术&#xff0c;不仅为我们提供了灵活性和可扩展性&#xff0c;还为软件开发和系统设计带来了…

在Linux虚拟机内配置nginx以及docker

目录 1、nginx源码包编译以及安装依赖 1、配置安装所需的编译环境 2、安装函数库&#xff08;pcre、zlib、openssl&#xff09; 2、安装nginx 1、获取源码包 2、解压编译 3、启动nginx服务 1、关闭防火墙 2、运行nginx 3、使用本地浏览器进行验证 3、安装docker 1、…

章节7:XSS检测和利用

章节7&#xff1a;XSS检测和利用 测试payload <script>alert(XSS)</script> <script>alert(document.cookie)</script> ><script>alert(document.cookie)</script> ><script>alert(document.cookie)</script> &qu…

【数据结构】“栈”的模拟实现

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

java线程的优先级、守护线程的概念

1.线程的调度 抢占式调度 非抢占式调度 1.1 抢占式调度 优先级越高&#xff0c;抢到cpu的概率越高 1.2 守护线程 守护线程&#xff0c;非守护线程。当其他的非守护线程执行完毕以后&#xff0c;守护线程会陆续结束。 守护线程的应用场景

SpringBoot06---前端路由VueRouter

单页面应用&#xff0c;意思是只有一个html&#xff0c;变化的内容是不同组件进行切换&#xff0c;每个组件加载网络请求&#xff0c;渲染对应的数据&#xff0c;这个内容就是学习怎么完成组件切换 以网易云音乐为例&#xff1a; 网易云音乐 (163.com) 现在无需注册&#xf…

力扣 377. 组合总和 Ⅳ

题目来源&#xff1a;https://leetcode.cn/problems/combination-sum-iv/description/ C题解&#xff08;来源代码随想录&#xff09;&#xff1a; 本题求的是排列总和&#xff0c;而且仅仅是求排列总和的个数&#xff0c;并不是把所有的排列都列出来。动规五部曲分析如下&…

【STM32】FreeRTOS消息队列和信号量学习

一、消息队列&#xff08;queue&#xff09; 队列是一种用于实现任务与任务之间&#xff0c;任务与中断之间消息交流的机制。 注意&#xff1a;1.数据的操作是FIFO模式。 2.队列需要明确数据的大小和队列的长度。 3.写和读都会出现堵塞。 实验&#xff1a;创建一个消息队列…