类的生命周期/加载

news2024/11/16 20:43:40

理一下,java 编译后的字节码文件,我们已经熟悉了 字节码文件长什么样,字节码文件中有哪些内容,那么下一步就是使用类加载器 把字节码文件加载到JVM中


类的生命周期

类的生命周期是 JVM类加载的基础。

在这里插入图片描述

加载

所谓加载,就是 根据类的全限定名(包名+类名)以二进制流的方式 将字节码文件信息 加载到 JVM中。

注意这里的源头不固定:就是说 我要加载的 字节码文件内容,但是这个内容是哪里来的不一定 可以从磁盘上来 有可能从网络上来,也有可能在JVM内部动态生成(动态代理技术,总之源头是很灵活的。

然后这些字节码文件内容 加载到了JVM中,问题来了 JVM将它们放在哪里?

这里引入一个虚拟概念叫 ”方法区“ 这些加载进来的 类 数据被放在一个虚拟空间 方法区里面

最后,加载进来之后,还有最后一步:

在JVM 中生成一个代表这个类的 java.lang.class对象,作为方法区这个类的各种数据(基础信息 常量池 字段 熟悉 方法 等)的方法入口

在这里插入图片描述

所以这里大家可以回想一下 为什么我们在使用发射的时候 可以通过 java类的java.lang.class对象 来获取类的名称 方法 属性等等, 就是因为在类加载过程中 JVM在堆上面创建了这个对象


验证

作为 连接 的第一阶段:
这个阶段就是各种校验 你加载进来的 字节码文件是不是符合各种java规范,这个阶段不需要程序员操心

准备

准备阶段 为 类变量(static 静态变量) 赋零值。
这里要注意 是赋一个零值,而不是赋值。(赋值要等到初始化阶段才开始)

解析

解析这一步是 将常量池里面的符号引用 转换为 JVM内存中的直接引用。

符号引用是常量池中人为设计的符号,通过符号去找到常量池中的某个值, 内存引用 就是直接通过内存地址找到这个值


初始化

经过了验证和解析 到了初始化,这个阶段和程序员就很紧密了:

静态变量赋值: 在初始化阶段,虚拟机会按照代码中的顺序为类的静态变量赋初值。这些静态变量可以是基本数据类型或引用类型。如果静态变量被声明为final,并且它的值是在编译时可以确定的常量,那么这个值将会被直接放入常量池,而不进行初始化。

静态代码块: 如果类中包含静态代码块,它会在静态变量赋值之后执行。静态代码块中的代码会按照在类中的声明顺序执行。这通常用于在类加载时进行一些初始化操作,例如静态资源的加载、静态变量的复杂初始化等。

实例变量赋值和实例代码块: 在初始化阶段,如果有实例变量被赋予初始值,这些实例变量的赋值操作会在执行构造函数之前进行。同时,如果有实例代码块(非静态代码块),它们也会在构造函数执行之前按照在类中的声明顺序执行。这一步骤是在类的初始化和对象的初始化之间的。

构造函数: 最后,执行构造函数。在初始化阶段,会调用对象的构造函数来完成对象的初始化。构造函数中的代码将在实例变量赋值和实例代码块执行之后执行。

需要注意的是,这些步骤并不是一成不变的,具体的初始化顺序还会受到访问权限、继承关系、static关键字的影响。例如,父类的初始化先于子类,子类的静态代码块和静态变量初始化先于实例变量和实例代码块。

总体而言,初始化顺序可以归纳为:静态变量赋值和静态代码块 -> 父类的初始化 -> 实例变量赋值和实例代码块 -> 子类的初始化 -> 构造函数。


这就是类的加载过程生命周期,后面还有类的使用和卸载 这个放到后面说

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

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

相关文章

贝叶斯推断:细谈贝叶斯变分和贝叶斯网络

1. 贝叶斯推断 统计推断这件事大家并不陌生,如果有一些采样数据,我们就可以去建立模型,建立模型之后,我们通过对这个模型的分析会得到一些结论,不管我们得到的结论是什么样的结论,我们都可以称之为是某种推…

【深度学习下载大型数据集】快速下载谷歌云盘数据集

个人博客:Sekyoro的博客小屋 个人网站:Proanimer的个人网站 跑深度学习的时候,一些数据集比较大,比如60多个G,而且只是训练集. 然后这些数据是由某些实验室组采集的,并不像一些大公司搞的,一般都直接方法一些网盘中. 如果是谷歌网盘,本身通过代理也不麻烦,但是发现即使通过代…

为什么大学c语言课不顺便教一下Linux,Makefile

为什么大学c语言课不顺便教一下Linux,Makefile,git,gdb等配套工具链呢? 在开始前我有一些资料,是我根据自己从业十年经验,熬夜搞了几个通宵,精心整理了一份「Linux的资料从专业入门到高级教程工具包」&…

【2024.01.03】转行小白-刷css面试题01

总结 1.margin 负值问题 margin-top 和 margin-left 负值,元素向上、向左移动,自己动margin-right 负值,右侧元素左移,自身不受影响,别人动margin-bottom 负值,下方元素上移,自身不受影响 &am…

第十四章 :案例课:部暑KVM虚拟化平台

[rootLinux01 ~]# mount /dev/cdrom /mnt //挂载安装KVM需要的软件 [rootLinux01 ~]# yum -y install qemu-kvm-tools [rootLinux01 ~]# yum -y install qemu-kvm [rootLinux01 ~]# yum -y install virt-install [rootLinux01 ~]# yum -y install qemu-img [rootLinux01 ~]#…

求一个整数二进制中1的个数(三种方法详解)

越过寒冬 前言 今天复习了一些操作符的知识,看到了这道题,并且发先有三种解题思路,觉得有趣,据记下来与诸位分享一下。 题目 写一个函数,给定一个整数,求他的二进制位中1的个数 思路1 既然是二进制位那…

JOSEF约瑟 断电延时继电器 SRTD-220VDC-2H2D 导轨安装

系列型号: SRTD-24VDC-1H1D断电延时继电器;SRTD-110VDC-1H1D断电延时继电器; SRTD-220VDC-1H1D断电延时继电器;SRTD-110VAC-1H1D断电延时继电器; SRTD-220VAC-1H1D断电延时继电器;SRTD-24VDC-2H断电延时继电…

一文搞懂手机卡的定向流量到底是什么!

最近有一些小伙伴对于手机卡流量中包含的定向流量这个概念不是很明白,而且也不知道具体如何使用,今天这个视频,葫芦弟就仔细给大家讲解一下,希望能解开小伙伴们心中的疑惑。废话不多说,我们直接进入正题! 首…

网络安全—模拟ARP欺骗

文章目录 网络拓扑安装使用编辑数据包客户机攻击机验证 仅做实验用途,禁止做违法犯罪的事情,后果自负。当然现在的计算机多无法被欺骗了,开了防火墙ARP欺骗根本无效。 网络拓扑 均使用Windows Server 2003系统 相关配置可以点击观看这篇文章…

git rebase(变基)应用场景

文章目录 git rebase(变基)应用场景1.git rebase -i HEAD~3 git rebase(变基)应用场景 使得提交记录变得简洁 现在我们模拟我们有多次提交记录,本地仓库有三条提交 整合成一条提交记录 1.git rebase -i HEAD~3 提交记录合并 HEAD~3合并三条记录 执行之后 然后把…

【Python机器学习】构建简单的k近邻算法模型

k近邻算法是一个很容易理解的算法,构建模型只需要保存训练数据集。要对一个新的数据点做出预测,算法会在训练集中寻找与这个新数据点距离最近的数据点,然后将找到的数据点的标签赋值给这个新数据点。 l近邻算法中k的含义是:我们可…

Ubuntu 常用命令之 locate 命令用法介绍

🔥Linux/Ubuntu 常用命令归类整理 locate命令是在Ubuntu系统下用于查找文件或目录的命令。它使用一个预先构建的数据库(通常由updatedb命令创建)来查找文件或目录,因此它的查找速度非常快。 plocate 安装 locate 不是 Ubuntu 系…

jdk动态代理中invoke的return返回的值有什么用?

目录 首先在接口中定义一个行为再定义一个目标角色实现接口,实现行为去代理角色类中解决一下报错,但是什么都不要写 invoke的return返回的值是调用方法中返回的值 下面我们来实例看一下 首先在接口中定义一个行为 public String toMarry02();再定义一个…

【论文阅读|冷冻电镜】DISCA: High-throughput cryo-ET structural pattern mining

论文题目 High-throughput cryo-ET structural pattern mining by unsupervised deep iterative subtomogram clustering 摘要 现有的结构排序算法的吞吐量低,或者由于依赖于可用模板和手动标签而固有地受到限制。本文提出了一种高吞吐量的、无需模板和标签的深度…

开源大模型应用开发

1.大语言模型初探 ChatGLM3简介 ChatGLM3-6B 是一个基于 Transformer 的预训练语言模型,由清华大学 KEG 实验室和智谱 AI 公司于 2023 年共同训练发布。该模型的基本原理是将大量无标签文本数据进行预训练,然后将其用于各种下游任务,例如文…

c++基础(对c的扩展)

文章目录 命令空间引用基本本质引用作为参数引用的使用场景 内联函数引出基本概念 函数补充默认参数函数重载c中函数重载定义条件函数重载的原理 命令空间 定义 namespace是单独的作用域 两者不会相互干涉 namespace 名字 { //变量 函数 等等 }eg namespace nameA {int num;v…

力扣每日一题99:恢复二叉搜索树

题目 给你二叉搜索树的根节点 root ,该树中的 恰好 两个节点的值被错误地交换。请在不改变其结构的情况下,恢复这棵树 。 示例 1: 输入:root [1,3,null,null,2] 输出:[3,1,null,null,2] 解释:3 不能是 1 …

数脉观察二丨 详解CroPoolv2.0锁仓收益机制 文末附锁仓教程

1月1日元旦佳节期间,CyberVein基金会支持打造的CroPoolv2.0最新版本正式上线,获得了圈内媒体和知名KOL多方的关注,在Staking领域掀起了热议,用户可以前往CroPool.net进行锁仓体验。 CroPool v2.0新增“锁仓”功能板块&#xff0c…

findata——科学数据搜索引擎

findata由中国科学院计算机网络信息中心提供,具有很强的数据检索能力。 网址如下:https://www.findata.cn/ 主界面十分简洁 我们试着输入landsat,点击搜索按钮,给出以下结果。 我们还可以添加条件,进一步进行筛选 数…

three.js gltf后处理颜色异常(伽马校正)

效果&#xff1a; 应用了伽马校正&#xff0c;好像效果不明显 代码&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red"><…