Java 类的加载流程

一、类的加载

指的是将类的.class 文件中的二进制

数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创

建一个 java.lang.Class 对象,用来封装类在方法区内的数据结构。

类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:

加载、验证、准备、解析、初始化、使用和卸载七个阶段。

二、加载步骤

1、加载

加载类加机制的第一个过程,在加载阶段,虚拟机主要完成三件事:

1)通过一个类的全限定名来获取其定义的二进制字节流

2)将这个字节流所代表的的静态存储结构转化为方法区的运行时数据结构

3)在堆中生成一个代表这个类的 Class 对象,作为方法区中这些数据的访问

入口。

相对于类加载的其他阶段而言,加载阶段是可控性最强的阶段,因为程序员可以

使用系统的类加载器加载,还可以使用自己的类加载器加载。我们在最后一部分

会详细介绍这个类加载器。在这里我们只需要知道类加载器的作用就是上面虚拟

机需要完成的三件事,仅此而已就好了。

2、验证

验证的主要作用就是确保被加载的类的正确性。也是连接阶段的第一步。说白了

也就是我们加载好的.class 文件不能对我们的虚拟机有危害,所以先检测验证一

下。他主要是完成四个阶段的验证:

1文件格式的验证:验证.class 文件字节流是否符合 class 文件的格式的规

范,并且能够被当前版本的虚拟机处理。这里面主要对魔数、主版本号、常量池

等等的校验(魔数、主版本号都是.class 文件里面包含的数据信息、在这里可以

不用理解)。腾讯课堂 Android 高级架构系列免费直播公开课

https://ke.qq.com/course/341933?flowToken=1017873&taid=5402300059563949&tuin=7e87248a

更多录播视频+架构学习资料免费领取 QQ 2677509374

2元数据验证:主要是对字节码描述的信息进行语义分析,以保证其描述的

信息符合 java 语言规范的要求,比如说验证这个类是不是有父类,类中的字段

方法是不是和父类冲突等等。

3字节码验证:这是整个验证过程最复杂的阶段,主要是通过数据流和控制

流分析,确定程序语义是合法的、符合逻辑的。在元数据验证阶段对数据类型做

出验证后,这个阶段主要对类的方法做出分析,保证类的方法在运行时不会做出

威海虚拟机安全的事。

4符号引用验证:它是验证的最后一个阶段,发生在虚拟机将符号引用转化

为直接引用的时候。主要是对类自身以外的信息进行校验。目的是确保解析动作

能够完成。

对整个类加载机制而言,验证阶段是一个很重要但是非必需的阶段,如果我们的

代码能够确保没有问题,那么我们就没有必要去验证,毕竟验证需要花费一定的

的时间。当然我们可以使用-Xverfity:none 来关闭大部分的验证。

3、准备

准备阶段主要为类变量分配内存并设置初始值。这些内存都在方法区分配。

在这个阶段我们只需要注意两点就好了,也就是类变量和初始值两个关键词:

1)类变量(static)会分配内存,但是实例变量不会,实例变量主要随着对象

的实例化一块分配到 java 堆中,

2)这里的初始值指的是数据类型默认值,而不是代码中被显示赋予的值。比

public static int value = 1; //在这里准备阶段过后的 value 值为 0,而不是 1。赋

值为 1 的动作在初始化阶段。

当然还有其他的默认值

4、解析

解析阶段主要是虚拟机将常量池中的符号引用转化为直接引用的过程。什么是符

号应用和直接引用呢?

符号引用:以一组符号来描述所引用的目标,可以是任何形式的字面量,

只要是能无歧义的定位到目标就好,就好比在班级中,老师可以用张三

来代表你,也可以用你的学号来代表你,但无论任何方式这些都只是一

个代号(符号),这个代号指向你(符号引用)

直接引用:直接引用是 可以指向目标的指针、相对偏移量或者是一个能直接或间接定位到目标

的句柄。和虚拟机实现的内存有关,不同的虚拟机直接引用一般不同。

解析动作主要针对类或接口、字段、类方法、接口方法、方法类型、方法句柄和

调用点限定符 7 类符号引用进行。

5、初始化

这是类加载机制的最后一步,在这个阶段,java 程序代码才开始真正执行。我们

知道,在准备阶段已经为类变量赋过一次值。在初始化阶端,程序员可以根据自

己的需求来赋值了。一句话描述这个阶段就是执行类构造器< clinit >()方法的过

程。

在初始化阶段,主要为类的静态变量赋予正确的初始值,JVM 负责对类进行初

始化,主要对类变量进行初始化。在 Java 中对类变量进行初始值设定有两种方

式:

声明类变量是指定初始值

使用静态代码块为类变量指定初始值

JVM 初始化步骤

1、假如这个类还没有被加载和连接,则程序先加载并连接该类

2、假如该类的直接父类还没有被初始化,则先初始化其直接父类

3、假如类中有初始化语句,则系统依次执行这些初始化语句

类初始化时机:只有当对类的主动使用的时候才会导致类的初始化,类的主动使

用包括以下六种:

创建类的实例,也就是 new 的方式访问某个类或接口的静态变量,或

者 对 该 静 态 变 量 赋 值 调 用 类 的 静 态 方 法 反 射 ( 如

Class.forName(“com.shengsiyuan.Test”))初始化某个类的子类,则其

父 类 也 会 被 初 始 化 Java 虚 拟 机 启 动 时 被 标 明 为 启 动 类 的 类

JavaTest),直接使用 java.exe 命令来运行某个主类好了,到目前

为止就是类加载机制的整个过程,但是还有一个重要的概念,那就是类加载器。

三、Java 语言系统自带有三个类加载器:

Bootstrap ClassLoader :最顶层的加载类,主要加载核心类库,也就

是我们环境变量下面%JRE_HOME%\lib 下的 rt.jarresources.jar

charsets.jar class 等。另外需要注意的是可以通过启动 jvm 时指定

-Xbootclasspath 和路径来改变 Bootstrap ClassLoader 的加载目录。比

java -Xbootclasspath/a:path 被指定的文件追加到默认的 bootstrap

路径中。我们可以打开我的电脑,在上面的目录下查看,看看这些 jar

包是不是存在于这个目录。

Extention ClassLoader :扩展的类加载器

加载目录%JRE_HOME%\lib\ext 目录下的 jar 包和 class 文件。还可以

加载-D java.ext.dirs 选项指定的目录。Appclass Loader:也称为

SystemAppClass。 加载当前应用的 classpath 的所有类。我们看到 java

为我们提供了三个类加载器,应用程序都是由这三种类加载器互相配合进行加载

的,如果有必要,我们还可以加入自定义的类加载器。这三种类加载器的加载顺

序是什么呢?

Bootstrap ClassLoader > Extention ClassLoader > Appclass

Loader(应用程序类加载器)

四、类加载的三种方式。

1)通过命令行启动应用时由 JVM 初始化加载含有 main()方法的主类。

2)通过 Class.forName()方法动态加载,会默认执行初始化块(static{}),但

Class.forName(name,initialize,loader)中的 initialze 可指定是否要执行初始化

块。

3)通过 ClassLoader.loadClass()方法动态加载,不会执行初始化块。

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

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

相关文章

自己实现的小功能

小功能实现 2024/1/31 问题一&#xff1a; 将文本模式的csv文件作为表编辑之后&#xff0c;先要再变回来。找了5分钟都没找到&#xff0c;去网上搜也没搜到 解决方案 复制一份&#xff0c;对没错。 不是把表遍历一遍&#xff0c;重新将数据写入。 3.5给的答案就是重新写入…

C#小结:ScottPlot 5.0在VS2022桌面开发的应用(以winform为例)

目录 一、官网文档地址 二、在VS2022中安装Scottplot 三、拖动Scottplot 四、使用Scottplot 五、效果图 一、官网文档地址 官网地址&#xff1a;ScottPlot 5.0 食谱 本文内容来自于官网&#xff0c;选取了官网的一些比较好用的功能展示&#xff0c;如需学习更多功能&a…

深度学习(9)--pydot库和graphviz库安装流程详解

目录 一.pydot库安装 二.graphviz库安装 一.pydot库安装 pydot的安装可直接在编译器安装相关包&#xff0c;以PyCharm举例&#xff1a; 如果搜索可用软件包显示为空&#xff0c;记得在此处把使用Conda软件包管理器”点亮 二.graphviz库安装 点击链接下载安装包graphviz-2.38…

机器学习复习(3)——分类神经网络与drop out

完整的神经网络 以分类任务为例&#xff0c;神经网络一般包括backbone和head&#xff08;计算机视觉领域&#xff09; 下面的BasicBlock不是一个标准的backbone,标准的应该是复杂的CNNs构成的 Classfier是一个标准的head,其中output_dim表示分类类别&#xff0c;一般写作num…

嵌入式——模拟/数字转换器(ADC)补充

目录 一、ADC简介 二、ADC功能 1.电压输入范围 2.输入通道 3. 转换顺序 &#xff08;1&#xff09;规则序列 &#xff08;2&#xff09; 注入序列 4.触发源 5. 转换时间 &#xff08;1&#xff09; ADC时钟 &#xff08;2&#xff09; 采样时间 6. 数据寄存器 &am…

抗体亲和力成熟制备高亲和力抗体-泰克生物

1.什么是抗体亲和力&#xff1f; 抗体亲和力是指抗体与抗原表位或抗原决定簇的结合强度&#xff0c;其实质是一种包含氨基酸间结合力——氢键、疏水性作用力等的非共价作用力。抗体亲和力的强弱取决于抗体与所用抗原表位的配合程度&#xff0c;其决定因素包括接触面积的大小、亲…

Linux实验记录:使用firewalld

前言&#xff1a; 本文是一篇关于Linux系统初学者的实验记录。 参考书籍&#xff1a;《Linux就该这么学》 实验环境&#xff1a; VmwareWorkStation 17——虚拟机软件 RedHatEnterpriseLinux[RHEL]8——红帽操作系统 备注: RHEL8系统中集成了多款防火墙管理工具&#xf…

【前端-VUE+TS】Vue3组件化-下(五)

一. 插槽的使用 1.1. 认识插槽slot 在开发中&#xff0c;我们会经常封装一个个可复用的组件&#xff1a; 前面我们会通过props传递给组件一些数据&#xff0c;让组件来进行展示&#xff1b;但是为了让这个组件具备更强的通用性&#xff0c;我们不能将组件中的内容限制为固定的d…

【buuctf Reverse】Java逆向解密wp

Java逆向解密 https://buuoj.cn/challenges#Java%E9%80%86%E5%90%91%E8%A7%A3%E5%AF%86 附件只有一个Reverse.class 用IntelliJ打开就能看到JAVA源码 这里就是生成flag的地方 int result arr[i] 64 ^ 32; 这个运算的逆运算难搞 注意运算的优先级&#xff0c;先运算在^ 代码…

图书管理系统(ArrayList和LinkedList)--versions3.0

目录 一、项目要求&#xff1a; 二、项目环境 三、项目使用的知识点 四、项目代码 五、项目运行结果 六、项目难点分析 图书管理系统--versions1.0&#xff1a; 图书管理系统--versions1.0-CSDN博客文章浏览阅读981次&#xff0c;点赞29次&#xff0c;收藏17次。本文使用…

5G智慧钢铁厂数字孪生三维可视化,推进钢铁新型工业化数字化转型

5G智慧钢铁厂数字孪生三维可视化&#xff0c;推进钢铁新型工业化数字化转型。随着科技的不断发展&#xff0c;数字化转型已经成为钢铁企业转型升级的必经之路。而5G技术的广泛应用&#xff0c;为钢铁企业数字化转型提供了新的机遇。其中&#xff0c;5G智慧钢铁厂数字孪生三维可…

cpu到达100%问题排查

0、背景 首先定位到mysql 的cpu使用率较高 原因是任务域的作业实例补偿定时任务相关sql查询问题&#xff0c;该sql 2min执行一次&#xff0c;一次查询两次&#xff0c;导致cpu飙升&#xff0c;可考虑优化sql&#xff0c;添加以下索引 ALTER TABLE scheduler.tbl_simba_os_sc…

StarRocks-3.1.0 单节点部署

1. 相关环境准备 FE&#xff1a; /opt/starrocks BE&#xff1a; /opt/starrocks 安装包下载 wget https://releases.starrocks.io/starrocks/StarRocks-3.1.0.tar.gz解压缩 tar -zxvf StarRocks-3.1.0.tar.gz 安装jdk (v2.5 及以上版本建议安装 JDK 11&#xff0c;我们使用…

搭建WebGL开发环境

前言 本篇文章介绍如何搭建WebGL开发环境 WebGL WebGL的技术规范继承自免费和开源的OpenGL ES标准&#xff0c;从某种意义上说&#xff0c;WebGL就是Web版的OpenGL ES&#xff0c;而OpenGL ES是从OpenGL中派生出来的。他们的应用环境有区别&#xff0c;一般来说&#xff1a;…

C++20 高级编程

文章目录 前言前奏lambda浅谈std::ref的实现浅谈is_same浅谈std::function的实现std::visit 与 std::variant 与运行时多态SFINAE类型内省标签分发 (tag dispatching)编译时多态奇异递归模板模式 (Curiously Recurring Template Pattern,CRTP) 三路比较操作符 (飞船操作符) <…

Django视图函数技巧,从入门到实战

文章目录 Django视图函数1.request对象的方法2.视图函数的常用的返回对象&#xff08;1&#xff09;response对象&#xff08;2&#xff09;JsonResponse对象&#xff08;3&#xff09;redirect() &#xff1a;给浏览器了一个30x的状态码 3.设置响应头和状态码&#xff08;1&am…

Apache Flink文件上传漏洞(CVE-2020-17518)漏洞代码分析

漏洞复现参考如下文章 Apache Flink文件上传漏洞&#xff08;CVE-2020-17518&#xff09;漏洞复现分析_文件上传漏洞复现cve-CSDN博客 分析代码的话&#xff0c;首先找到漏洞修复的邮件 漏洞详情&#xff0c;可以看到漏洞概要&#xff0c;影响的版本&#xff0c;漏洞描述以及…

【Linux笔记】文件描述符与重定向

一、Linux关于文件操作的一些系统调用 1、open和close 我们在C语言阶段已经学过很多文件操作的函数&#xff0c;今天我们要来看看操作系统中对于文件是怎么操作的。 1.1、open与close的用法 C语言的库函数中有很多关于文件操作的接口&#xff0c;包括fopen、fclose、fprint…

Docker容器引擎镜像创建

目录 一、镜像的创建 &#xff08;一&#xff09;基于现有镜像创建 1.启动一个镜像&#xff0c;在容器里做修改 2.将修改后的容器提交为新的镜像 &#xff08;二&#xff09;基于本地模板创建 &#xff08;三&#xff09;基于Dockerfile 创建 1.联合文件系统&#xff08…

五大架构之一:系统架构数据流风格

系统架构数据流风格详细介绍 系统架构数据流风格是一种软件体系结构风格&#xff0c;它强调了系统内部不同部分之间的数据流动。这种风格侧重于描述系统中的数据处理过程&#xff0c;以及数据是如何从一个组件传递到另一个组件的。以下是系统架构数据流风格的详细介绍&#xff…