【jvm】类加载子系统

目录

        • 一、图
        • 二、类加载器作用
        • 三、类加载器角色
        • 四、类的加载过程
          • 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.rhkb.cn/news/89116.html

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

相关文章

解密Flink的状态管理:探索流处理框架的数据保留之道,释放流处理的无限潜能!

水善利万物而不争&#xff0c;处众人之所恶&#xff0c;故几于道&#x1f4a6; 文章目录 一、什么是状态二、应用场景三、Flink中状态的分类四、算子状态1. 列表状态&#xff08;List State&#xff09;2. 广播状态&#xff08;Broadcast State&#xff09; 五、键控状态1. Val…

股票指数——RSI指数

RSI指数的计算非常简单&#xff0c;就是使用一段时间内的平均上涨除以平均上涨加平均下跌&#xff08;取正值&#xff09;。也就意味着RSI指数的取值是[0,100]之间&#xff0c;其中0表示周期内没有上涨的&#xff0c;100表示周期内没有下跌的。RSI的直观意义是它表示了一段周期…

用神经网络玩转数据聚类:自编码器的原理与实践

目录 引言一、什么是自编码器二、自编码器的应用场景三、自编码器的优缺点四、如何实现基于自编码器的聚类算法五、总结 引言 随着数据量的爆炸性增长&#xff0c;如何有效地处理和分析数据成为了一个重要的问题。数据聚类是一种常用的数据分析方法&#xff0c;它可以将数据集…

gateway做token校验

本文使用springcloud的gateway做token校验 登录的本质&#xff1a;拿用户名和密码 换 token。 token会返回给浏览器&#xff08;存储&#xff09;&#xff0c;当访问的时候&#xff0c;携带token 发起请求。 token校验图 引入redis依赖 <dependency><groupId>or…

codeforces代:

感受思维的美丽&#xff0c;abcde题目的思路是怎么样的&#xff1a; 上蓝 上紫 可以代 &#xff1a;有问题可以评论区 直接问我 也可以q: 639682754

Django入门

Day1 django环境安装 创建虚拟环境 # step1 创建虚拟环境 python3 -m venv datawhale_django # step2 mac进入虚拟环境 source ./datawhale_django/bin/activate # step3 退出虚拟环境 deactivate安装包 pip3 install django ​pip3 install djangorestframework​​ pip3 …

关于selenium 元素定位的浅度解析

一、By类单一属性定位 元素名称 描述 Webdriver API id id属性 driver.find_element(By.ID, "id属性值") name name属性 driver.find_element(By.NAME, "name属性值") class_name class属性 driver.find_element(By.CLASS_NAME, "class_na…

【Vue-Router】路由入门

路由&#xff08;Routing&#xff09;是指确定网站或应用程序中特定页面的方式。在Web开发中&#xff0c;路由用于根据URL的不同部分来确定应用程序中应该显示哪个内容。 构建前端项目 npm init vuelatest //或者 npm init vitelatest安装依赖和路由 npm install npm instal…

VSCode如何设置高亮

一、概述 本文主要介绍在 VSCode 看代码时&#xff0c;怎样使某个单词高亮显示&#xff0c;主要通过以下三步实现&#xff1a; 安装 highlight-words 插件 配置 highlight-words 插件 设置高亮快捷键F8 工作是嵌入式开发的&#xff0c;代码主要是C/C的&#xff0c;之前一直用…

什么是媒体代发布?媒体代发布注意事项

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 媒体代发布是指将新闻稿或其他宣传内容委托给专业的媒体代理机构或公司进行发布和推广的活动。这些机构通常拥有丰富的媒体资源、人脉和经验&#xff0c;能够更好地将信息传递给目标受众…

数学分析:曲线曲面积分

这一章还是很重要的&#xff0c;可以看到为什么dt1^dt2和dt1dt2是一样的。 可以看到&#xff0c;核心还是黎曼和&#xff0c;我们把两种微分的黎曼和都列出来&#xff0c;并且证明两个相等&#xff0c;即可。 这里要注意&#xff0c;微分形式的积分&#xff0c;在黎曼和的情况…

布置Zabbix监控

一、在 Web 页面中添加 agent 主机 1.1打开Zabbix的Web页面 2.2在 Web 页面中添加 agent 主机 二、在 Web 页面创建自定义监控项模板 2.1创建模版

django实现登录和登录的鉴权

1、创建数据库的管理员表 在models.py 中定义admin表&#xff0c;为了简单&#xff0c;表里只有用户名和密码还有默认加的id 三个字段 from django.db import models# Create your models here.class Admin(models.Model):username models.CharField(verbose_name"用户…

【JavaEE进阶】Spring 更简单的读取和存储对象

文章目录 一. 存储Bean对象1. 配置扫描路径2. 添加注解存储 Bean 对象2.1 使用五大类注解存储Bean2.2 为什么要有五大类注解&#xff1f;2.3 有关获取Bean参数的命名规则 3. 使用方法注解储存 Bean 对象3.1 方法注解储存对象的用法3.2 Bean的重命名3.3 同⼀类型多个 Bean 报错 …

【力扣每日一题】88. 合并两个有序数组 双指针 辅助数组 8.13打卡

文章目录 题目思路代码 题目 88. 合并两个有序数组 难度&#xff1a; 简单 描述&#xff1a; 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&am…

Excel(1):表头或列头冻结

1.需求 对于较大的excel&#xff0c;通常需要固定一部分内容&#xff0c;另一份内容为可翻动。 2.解决方式 在视图中选择冻结窗格&#xff0c;需要注意的是&#xff0c;选择冻结窗格时&#xff0c;窗格的左上方的表格区域是固定不动的&#xff0c;只可以向下或者向右活动。

TCP/IP 下的计算机网络江湖

〇、引言 在当今数字化时代,计算机网络宛如广袤江湖,涵盖着五大门派:物理层、数据链路层、网络层、传输层和应用层。每个门派独具技能,共同构筑着现代网络的框架。物理层宛如江湖基石,将比特流传输;数据链路层如武林传承,组织数据帧传递;网络层则像导航大师,寻找传送路…

EMQX Enterprise 5.1 正式发布:生产环境就绪的 MQTT over QUIC、基于 MQTT 的文件传输支持

近日&#xff0c;企业级 MQTT 物联网接入平台 EMQX Enterprise 5.1 正式发布。该版本为用户提供了更强大、更灵活的物联网解决方案&#xff0c;通过简化功能操作与管理流程&#xff0c;帮助用户快速构建所需的业务。 新版本提供了更大规模且更具伸缩性的全新集群架构&#xff…

Mac M2 Pro安装使用Cocoapods

Mac Pro M2安装使用Cocoapods 在新公司要做iOS开发&#xff0c;所以在新电脑上安装Cocoapods 在升级gem&#xff0c;sudo gem update --system&#xff0c;和安装cocoapods时都遇到如下的提示&#xff1a; ERROR: While executing gem ... (Errno::EPERM)Operation not per…

探讨uniapp的网络通信问题

uni-app 中有很多原生的 API&#xff0c;其中我们经常会用到的肯定有&#xff1a;uni.request(OBJECT) method 有效值 注意&#xff1a;method有效值必须大写&#xff0c;每个平台支持的method有效值不同&#xff0c;详细见下表。 success 返回参数说明 data 数据说明 最终…