JVM类加载过程

在Java虚拟机规范中,把描述类的数据从class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的java.lang.Class对象,这个过程被称作类加载过程。一个类在整个虚拟机周期内会经历如下图的阶段,从加载到初始化就是类加载过程。
在这里插入图片描述

加载阶段

这里的加载是整个类加载过程中的一个阶段,不等同于类加载,在加载阶段,会做以下三件事:

  1. 通过类的全限定名读取类的二进制流。
  2. 将字节流所代表的的静态存储结构转化为方法区的运行时数据结构。
  3. 在虚拟机内存的堆区中生成一个代表这个类的java.lang.Class对象,用于方法区这个类的各种数据的访问入口(如下图所示)。
    在这里插入图片描述
    由于Java虚拟机对加载class文件的来源并未做限制,所以出现了以下的class文件加载方式:
  4. 从本地系统中直接获取
  5. 从网络中获取,如:Web Applet
  6. 从zip压缩包中获取,将zip压缩后缀改为.jar,也可以直接使用
  7. 动态代理生成
  8. 由其他文件生成,如JSP
  9. 从数据库中获取
  10. 加密文件中获取,如Class文件加密防反编译

链接阶段

在加载阶段完成之后,class文件的类信息数据就会存储在方法区,同时在Java虚拟机堆区生成一个对应类的Class对象,这个Class对象会在之后变成程序访问方法区中的类数据的外部接口。链接阶段并不是一定等到加载阶段完成后才开始,链接的部分动作会跟随加载阶段进行(如部分字节码文件格式的验证动作)。

  1. 验证
    验证是链接的第一个阶段,这个过程中,JVM会去校验class文件格式及class文件二进制流中所包含的信息是不是符合虚拟机规范的约束。包含四部分内容的验证:
  • 文件格式验证:验证class文件魔数值是否为0xCAFEBABE、主次版本号、常量类型等。
  • 元数据验证:对类的元数据信息进行语义校验。
  • 字节码验证:通过数据流分析和控制流分析、确定程序语义是合法的、符合逻辑的。
  • 符号引用验证:验证发生在解析阶段,主要对常量池中的各种符号引用进行匹配性校验。
  1. 准备
    在这里插入图片描述
    在准备阶段,会给类变量(被static修饰的静态变量)分配内存并且初始化类变量初值(零值),如上表就是各种类型对应的零值,从概念上讲,这些变量所使用的内存都应当在方法区中进行分配,但是方法区本身是一个逻辑上的区域,在JDK7及之前,HotSpot使用永久代来实现方法区时,实现是完全符合这种逻辑概念的;而在JDK8及之后,类变量则会随着Class对象一起存放在Java堆中,这时候"类变量在方法区" 就完全是一种对逻辑概念的表述;
    注意:
  2. final修饰的类变量(常量)并不会进行准备阶段进行赋初值的操作,在编译的时候会给属性添加ConstantValue属性,准备阶段直接完成赋值。
  3. 正因为类变量拥有赋初值这一操作,所以只声明类变量,不进行赋值动作,程序也能正常执行,如下代码可以验证各种类型的初值。
public class ClassLoaderPrepare {public static int i;public static void main(String[] args) {System.out.println(i);}
}
  1. 解析
    解析阶段的作用是将符号引用转为直接引用。每个class文件都对应一个常量池,常量池中存储了类、接口、字段、方法等各类信息,符号引用是一组符号指向常量池中被引用的目标,要在虚拟机中定位到目标,就需要指向对应目标的内存地址,这种引用就是直接引用。

初始化阶段

在链接阶段的准备阶段中,已经为类变量分配了内存地址和初值,在初始化阶段就会对这些类变量进行赋值操作。如果一个类含有静态变量或者静态代码块,java虚拟机就会在编译为其生成一个方法(类初始化方法),其内容由编译期间虚拟机收集到的类变量的赋值动作和静态代码块合并而来。
注意:

  1. 方法中,指令的顺序是依据指令对应的语句在源文件中出现的顺序,静态代码块中只能访问定义在它之前的变量,如下代码就会提示非法的前向引用。
  2. 在继承关系中,父类的方法先于子类执行。
  3. 在多线程同时初始化一个类时,只有其中一个线程能够执行
public class ClassLoaderCLInit {static {i = 10;System.out.println(i);}public static int i;
}

使用

销毁

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

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

相关文章

DIYP对接骆驼后台IPTV管理,退出菜单中显示用户名已经网络信息,MAC,剩余天数,套餐名称等

演示:https://url03.ctfile.com/f/1779803-1042599473-4dc000?p8976 (访问密码: 8976) 后台加上EPG,增加一些播放源的动态端口替换。 前台app上,退出菜单中显示用户名已经网络信息,MAC,剩余天数,套餐名称…

Python知识点17---包

提前说一点:如果你是专注于Python开发,那么本系列知识点只是带你入个门再详细的开发点就要去看其他资料了,而如果你和作者一样只是操作其他技术的Python API那就足够了。 Python的包,你可以把它看成是一个大的模块,它…

JAVA基础|多线程

什么是线程? 线程(Thread)是一个程序内部的一条执行流程。 多线程是什么? 多线程是指从软硬件上实现的多条执行流程的技术(多条线程由CPU负责调度执行) 一. 如何在程序中创建出多条线程? Ja…

Windows10系统中安装与配置PyTorch(无GPU版本)

文章目录 1. 什么是PyTorch2. PyTorch的安装与配置(无GPU)2.1 创建环境2.2 安装pytorch库(无GPU)2.3 验证安装结果 1. 什么是PyTorch PyTorch 是一种用于构建深度学习模型且功能完备的开源框架,通常用于处理图像识别和…

OpenCV 的几种查找图像中轮廓边缘的方法

原始图片: 1、Sobel() Sobel 算子结合了高斯平滑和微分,用于计算图像的梯度,从而突出显示边缘。 import cv2# 读取图像 image cv2.imread(image.png, cv2.IMREAD_GRAYSCALE)# 使用 Sobel 算子查找水平和垂直边缘 sobel_x cv2.Sobel(image…

建筑企业有闲置资质怎么办?

如果建筑企业拥有闲置资质,可以考虑以下几种方式来充分利用这些资质: 1. 租赁或转让资质: 将闲置的建筑资质租赁给其他企业或个人使用,或者通过转让的方式将资质出售给有需要的企业或个人。 2. 提供咨询服务: 利用建…

OneForall工具的下载安装和使用(Windows和Linux)

目录 OneForall的介绍 OneForall的下载 OneForall的安装 安装要求 安装步骤(git 版) 安装(kali) OneForall的使用命令 在Windows 在Linux(kali) OneForall的结果说明 免责声明 本文所提供的文字和…

车辆前向碰撞预警系统性能要求和测试规程

前言 本文整理《GB/T 33577-2017 智能运输系统-车辆前向碰撞预警系统性能要求和测试规程》国标文件关键信息,FCW系统性能和测试右给深层次的认识。 术语和定义 车辆前向碰撞预警系统 forward vehicle collision warning system自车 subject vehicle(SV)目标车辆 target ve…

【Linux】查找和压缩

一、文件查找 1、命令查找 which 2、文件查找、依赖数据库 locate 3、文件查找 find 语法:find [path] [options] [expression] [action] ①按文件名 -name按名 -iname可不区分大小写 ②按文件大小 5M:5M以上文件 5M:5M文件 -…

高中数学:解三角形相关公式总结及用法总结

一、正弦定理 二、余弦定理 三、三角形面积公式 由正弦定理,可以推出三角形的面积公式: S*ab*sinC S*ac*sinB S*bc*sinA 四、使用方法总结 五、练习 例题1 解析 对条件等式进行变形,结合余弦定理,求出∠A的度数,从而…

Nginx01-HTTP简介与Nginx简介(安装、命令介绍、目录介绍、配置文件介绍)

目录 HTTP简介HTTP原理查看访问网站的详细流程curl -vwget --debug 查看网站访问量HTTP协议版本HTTP协议交互HTTP 请求请求报文起始行请求头 HTTP响应响应报文起始行响应头 Nginx常见的Web服务常见网站服务 安装NginxNginx目录结构Nginx启动管理Nginx常用命令 Nginx配置文件主配…

国内外主流大模型语言技术大比拼

国内外主流大模型语言技术对比 2024 自2017年起,美国深度布局人工智能,全面融入经济、文化与社会。至2023年,中国凭借自研技术平台崭露头角,ChatGPT及其技术成国家战略焦点,引领未来科技浪潮。中美竞逐,人工…

香橙派 AI pro:AI 加速初体验

香橙派 AI pro:AI 加速初体验 在AI领域,不断涌现的硬件产品为开发者提供了前所未有的便利和可能性。今天,我要介绍的这款产品——香橙派 AIpro,就是其中的佼佼者。在昇腾 AI 芯片的加持下,这款开发板有着出色的算力。…

961题库 北航计算机 操作系统 附答案 选择题形式

有题目和答案,没有解析,不懂的题问大模型即可,无偿分享。 第1组 习题 计算机系统的组成包括( ) A、程序和数据 B、处理器和内存 C、计算机硬件和计算机软件 D、处理器、存储器和外围设备 财务软件是一种&#xff…

【Qt 学习笔记】Qt窗口 | 对话框 | Qt对话框的分类及介绍

博客主页:Duck Bro 博客主页系列专栏:Qt 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ Qt窗口 | 对话框 | 模态对话框 文章编号:Qt 学习笔记 / 51…

Java反序列化漏洞与URLDNS利用链分析

前言 前面学习过 Java 反序列化漏洞的部分知识,总结过几篇文章: 文章发布日期内容概括《渗透测试-JBoss 5.x/6.x反序列化漏洞》2020-07-08JBoss 反序列化漏洞 CVE-2017-12149 的简单复现,使用了 ysoserial 和 CC5 链,未分析漏洞…

easy-captcha生成验证码

引入依赖 <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>…

机械设计手册第一册:公差

形位公差的标注&#xff1a; 形位公差框格中&#xff0c;不仅要表达形位公差的特征项目、基准代号和其他符号&#xff0c;还要正确给出公差带的大小、形状等内容。 1.形位公差框格&#xff1a; 形位公差框格由两个框格或多个格框组成&#xff0c;框格中的主要内容从左到右按…

(2024,扩散,去噪调度,维度,误差,收敛速度)适应基于分数的扩散模型中的未知低维结构

Adapting to Unknown Low-Dimensional Structures in Score-Based Diffusion Models 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 1. 引言 1.1 扩散模型 1.2 现有结果的不…

服务器硬件基础知识学习

服务器硬件基础知识涵盖了从CPU到存储&#xff0c;再到网络连接和总线技术等关键组件。 1. 处理器 - 两大流派&#xff1a;我们常用的处理器主要分为Intel和AMD两大阵营。Intel的Xeon系列和AMD的EPYC系列都是专为服务器设计的&#xff0c;它们支持多核处理&#xff0c;能够应对…