JVM 中类加载的链接与初始化

news2024/11/15 17:21:24

类加载系统,主要有以下部分 

  • 加载
  • 链接
    • 验证
    • 准备
    • 解析
  • 初始化

它们每部分都做些什么事情呢?

加载

(2条消息) JVM 双亲委派模型_兜兜转转m的博客-CSDN博客

链接

链接-验证

一般验证部分,IDEA已经帮我们规范了。

验证是连接阶段的第一步,这一阶段的目的是为了确保 Class 文件的字节流中包含的信息符合当前虚拟机的要求,并不会危害虚拟机的自身安全。

验证过程的主要验证信息:验证过程中,主要对三种类型的数据进行验证,分别是“元数据验证,字节码验证和符号引用验证”。具体内容请看下边的讲解。

  • 验证这个类是否有父类(除了 java.lang.Object 之外,所有类都应当有父类);
  • 验证这个类是否继承了不允许被继承的类(被 final 修饰的类);
  • 如果这个类不是抽象类,验证该类是否实现了其父类或接口之中所要求实现的所有方法
  • 验证类中的字段、方法是否与父类产生矛盾(例如覆盖了父类的 final 字段,或者出现不符合规则的方法重载,例如方法参数都一致,但返回值类型却不同等等)

字节码验证:字节码验证主要目的是通过数据流和控制流分析,确定程序语义是合法的、符合逻辑的。这个阶段将对类的方法体进行校验分析,保证被校验类的方法在运行时不会产生危害虚拟机安全的事件,例如:

  • 保证任意时刻操作数栈的数据类型与指令代码序列都能配合工作。例如不会出现类似这样的情况:在操作数栈放置了一个int类型的数据,使用时却按long类型来加载入本地变量表中;
  • 保证跳转指令不会跳转到方法体以外的字节码指令上;
  • 保证方法体中的类型转换是有效的,例如可以把一个子类对象赋值给父类数据类型,但是把父类对象赋值给子类数据类型,甚至把对象赋值给与它毫无继承关系、完全不相干的一个数据类型,则是危险不合法的

符号引用验证:符号引用验证可以看作是类对自身以外(常量池中的各种符号引用)的信息进行匹配性校验,通常需要校验以下内容:

  • 符号引用中通过字符串描述的全限定名是否能够找到对应的类;
  • 在指定类中是否存在符合方法的字段描述符以及简单名称所描述的方法和字段;
  • 符号引用中的类、字段、方法的访问性(private、default、protected、public)是否可被当前类访问。

链接-准备(prepare)

为类变量进行赋值和初始化。

准备阶段是正式为类变量分配内存(静态变量哦)并设置类变量默认值(通常情况下是数据类型的零值)的阶段,这些变量所使用的内存都将在方法区中进行分配。这时候进行内存分配的仅包括类变量(被static修饰的变量),而不包括实例变量,实例变量将会在对象实例化的时候随着对象一起分配在Java堆中。

链接-解析(resolve)

解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程

符号引用(Symbolic References):符号引用以一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能无歧义地定位到目标即可。

直接引用(Direct References)直接引用可以是直接指向目标的指针、相对偏移量或是一个能间接定位到目标的句柄。如果有了直接引用,那么引用的目标一定是已经存在于内存中。

解析过程具体的解析内容:解析过程中,主要对如下4种类型的数据进行验证:

  • 类或接口的解析;
  • 字段解析;
  • 类方法解析;
  • 接口方法解析。

初始化

定义:进行准备阶段时,变量已经赋过一次系统要求的初始零值,而在初始化阶段,则会根据程序员通过程序编码制定的主观计划去初始化类变量和其他资源


总结

Java中的静态变量静态代码块是在类加载的时候就执行的,实例化对象时,先声明并实例化变量再执行构造函数。如果子类继承父类,则先执行父类的静态变量和静态代码块再执行子类的静态变量和静态代码块。同样,接着在执行父类和子类非静态代码块和构造函数。

注意:(静态)变量和(静态)代码块的也是有执行顺序的,与代码书写的顺序一致。在(静态)代码块中可以使用(静态)变量,但是被使用的(静态)变量必须在(静态)代码块前面声明。

最后给出执行步骤:

  1. 父类静态变量和静态代码块(先声明的先执行)---按照编码顺序;
  2. 子类静态变量和静态代码块(先声明的先执行)---按照编码顺序;
  3. 父类的变量和代码块(先声明的先执行)---按照编码顺序;
  4. 父类的构造函数;
  5. 子类的变量和代码块(先声明的先执行)---按照编码顺序;
  6. 子类的构造函数

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

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

相关文章

第二章 数据库设计

数据库技术是信息资源管理最有效的手段。数据库设计是指对于一个给定的应用环境,构造最优的数据库模式,建立数据库极其应用系统,有效存储数据,满足用户信息要求和处理要求。 数据库设计的步骤 ⒈需求分析阶段 收集和分析用户需…

怎么搭建属于自己的网站?

搭建属于自己的网站已经不是什么新鲜事了,有些人甚至搭建一个网站用来做自己的简历。搭建网站对一些懂代码的人来说也是比较简单的,就算不精通也能下载源代码模板。那如果不太懂代码的小伙伴,又怎么搭建属于自己的网站呢? 一、善…

SpringBoot 代码混淆真香,再也不用担心反编译代码泄露...

编译 简单就是把代码跑一哈,然后我们的代码 .java文件 就被编译成了 .class 文件 反编译 就是针对编译生成的 jar/war 包 里面的 .class 文件 逆向还原回来,可以看到你的代码写的啥。 比较常用的反编译工具 JD-GUI ,直接把编译好的jar丢进…

MySQL 进阶 图文详解InnoDB储存引擎

前言 SQL 语句的最终执行者是存储引擎。存储引擎在经解析器、优化器处理后被执行器调用其接口执行优化后的执行计划。MySQL 存储引擎包括 InnoDB、Myisam、Memory、Archive、CSV 存储引擎等,其中最常用也是MySQL 默认的存储引擎是 InnoDB。 写入缓冲池(…

cyclictest生成结果统计图

在用cyclictest测试实时性的时候通过输出的结果能清晰的看到最大值、最小值平均值,但具体的分布情况无法直接得到。 本文记录根据网上的博客实际测试结果。 1、先在开发板上运行测试程序 ./cyclictest -l 1000000 -m -Sp99 --policyfifo -h 25000 -q >output 得…

华为机试 - 高矮个子排队

目录 题目描述 输入描述 输出描述 用例 题目解析 算法源码 题目描述 现在有一队小朋友,他们高矮不同,我们以正整数数组表示这一队小朋友的身高,如数组{5,3,1,2,3}。 我们现在希望小朋友排队,以“高”“矮”“高”“矮”顺…

专利变更需要哪些材料

一、专利变更需要哪些材料 专利权人变更专利的,需要提供著录项目变更请求书、著录项目变更证明材料、专科权人身份证明等材料。 《专利法实施细则》 第八十九条 国务院专利行政部门设置专利登记簿,登记下列与专利申请和专利权有关的事项: …

聚观早报|苹果高管称ipad在走下坡路;罗永浩新公司完成融资

今日要闻:苹果高管称ipad在走下坡路;罗永浩新公司完成融资;谷歌发布最新可持续发展成果;比亚迪新能源车涨价;惠普宣布裁员6千人 前苹果高管称ipad在走下坡路 据报道,前苹果公司高管让路易斯加塞近日表示&am…

无符号、有符号数运算判溢出

目录 无符号数的运算(溢出看CF) 有符号数运算(溢出看OF)(都是补码进行运算,因为补码的符号位可以直接参与运算一套电路就ok) 例题 第一题 第二题 无符号数的运算(溢出看CF&#…

会议信息管理系统SSM记录(六)

目录: (1)会议预定1 (2)会议预定2 (3)会议预约3 (4)会议预定4 (1)会议预定1 创建MeetingController: //跳转预定会议页面Request…

嵌入式面试题

1、写一个程序判断电脑是大端字序还是小端字序&#xff08;加量不加价&#xff09; #include <stdio.h> #include <arpa/inet.h> typedef unsigned char byte; typedef unsigned int word; int main(int argc, char *argv[]) {word val32 0x11223344;byte val8 …

业务流程管理包括什么

​什么是业务流程管理&#xff1f; 业务流程管理 (BPM)提供了一些用于发现、建模、分析、衡量、改进和优化业务策略及流程的方法。 在知名企业中&#xff0c;麦当劳是因为业务流程管理而获得成功的企业之一&#xff0c;标准化业务流程制度是麦当劳成功的关键。 麦当劳为了保证…

CAS号:2578-57-6,H2N-PG-OH

脯氨酸酶的底物(脯氨酸二肽酶)。 编号: 116803中文名称: 二肽Pro-Gly英文名: Pro-GlyCAS号: 2578-57-6单字母: H2N-PG-OH三字母: H2N-Pro-Gly-COOH氨基酸个数: 2分子式: C7H12N2O3平均分子量: 172.18精确分子量: 172.08等电点(PI): 6.11pH7.0时的净电荷数: -0.02平均亲水性: -疏…

MCE | 为什么肥胖经常被“针对”?

近年来&#xff0c;肥胖问题受到越来越多的关注&#xff0c;肥胖不只影响美丽身材&#xff0c;过度肥胖还可能导致肥胖症&#xff0c;这是很多疾病的高风险因素。所以肥胖是一种病&#xff1f;肥胖的标准是什么&#xff1f;别急&#xff0c;等小编慢慢道来。 认识肥胖症 (Obesi…

大数据毕设选题 - 深度学习口罩佩戴检测系统(python OpenCV YOLO)

文章目录0 前言1 课题介绍2 算法原理2.1 算法简介2.2 网络架构3 关键代码4 数据集4.1 安装4.2 打开4.3 选择yolo标注格式4.4 打标签4.5 保存5 训练6 实现效果6.1 pyqt实现简单GUI6.2 图片识别效果6.3 视频识别效果6.4 摄像头实时识别7 最后0 前言 &#x1f525; Hi&#xff0c…

通过ref进行组件间的通信

ref&#xff1a;绑定dom节点&#xff0c;拿到的就是dom对象&#xff1b; ref&#xff1a;绑定组件&#xff0c;拿到的就是组件对象&#xff1b; ref绑在dom节点上&#xff1a; //绑在dom上&#xff0c; <input type"text" ref"mytext"> <input…

SpringCloud微服务(十二)——Seata分布式事务

SpringCloud Alibaba Seata分布式事务 简介 Seata是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务 官网&#xff1a;http://seata.io/zh-cn/ 一次业务操作需要垮多个数据源或需要垮多个系统进行远程调用,就会产生分布式事务问题…

PDF的两种密码忘记了,怎么解决

PDF文件带有两种加密方式&#xff0c;大家一定都很熟悉&#xff0c;因为大部分文件都有这两种加密方式&#xff0c;比如Word、Excel、PPT、压缩包等。PDF文件也有这两种密码。 那就是&#xff1a;打开密码、编辑限制 打开密码&#xff1a;就是在我们打开PDF文件的时候&#x…

聚焦离子束FIB测试的计量技术规范盘点

聚焦离子束系统采用聚焦的离子束对样品表面进行轰击&#xff0c;并由计算机控制离子束的扫描或加工轨迹、步距、驻留时间和循环次数&#xff0c;以实现对材料的成像、刻蚀、诱导沉积和注入的分析系统。其应用已经从界面检测扩展到纳米图像制备、透射样品制备、三维成像和分析、…

网络安全加固的必要性

随着信息化的快速变化&#xff0c;企业和机构面临网络安全威胁也越来越多&#xff0c;每一种安全防护措施就像是桶的一块木板&#xff0c;这个木桶中承载着的水就好比网络中运行的各种业务。各种业务能否安全、稳定地运转取决于最矮木板的高度和各块木板之间是否存在缝隙。为了…