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,一经查实,立即删除!

相关文章

C++编程法则365天一天一条(323)main函数执行之前和之后的动作

在C和C程序中,main 函数之前和之后执行的函数是由编译器、链接器和运行时环境共同决定的。以下是一些通常会在这些阶段执行的关键函数: 在 main 函数之前执行的函数 启动代码(Start-up Code): 这是由编译器提供的一段代码&#…

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…

新接手业务的线上Bug特别多怎么办?

文章目录 接手:保证质量顺利过渡紧急质量审计临时增加测试频次灰度发布加强监控与预警建立快速反馈机制 打补丁:针对性解决质量问题Bug 分析与分类测试策略优化环境一致性 搞基建:全流程质量控制需求分析与评审设计阶段的评审与验证代码质量控…

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

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

JVM学习-自定义类加载器

为什么要自定义类加载器 隔离加载类 在某些框架内进行中间件与应用的模块隔离,把类加载到不同的环境,如Tomcat这类Web应用服务器,内部自定义了好几种类加载器,用于隔离同一个Web应用服务器上的不同应用程序 修改类加载的方式 …

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

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

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

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

git分布式版本控制系统(四)

目前世界上最先进的分布式版本控制系统 官方网址:https://git-scm.com 学习目标: 1 了解 git 前世今生 2 掌握 git 基础概念、基础操作 3 各种 git 问题处理 4 互联网常用 gitflow(工作流程规范) 5 git 代码提交规范 6 git 分支管理及命名规范 常见问…

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的度数,从而…

【面经分享-CPP篇】[建议收藏!!] C++基础20问-01

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新c面试基础 👏 感谢大家的订阅➕ 和 喜欢💗 文章目录 1.题目:解释C中的RAII机制。2.题目:解释C中的智能指针及其类型。3.题目&#xf…

从内存到sql的upsert

业务的upsert ​ 在写业务时,大家一开始都会以顺序流程的方式开始着手写代码,CR时再看代码,会有不一样的感觉。 1. 需求描述 ​ 现有一张数据库表,表字段结构如下: 字段名称类型描述uuidstring数据的唯一键datastrin…

代码随想录算法训练营第四十六天|KM52. 携带研究材料、518. 零钱兑换 II、377. 组合总和 Ⅳ

代码随想录算法训练营第四十六天 KM52. 携带研究材料 题目链接:KM52. 携带研究材料 确定dp数组以及下标的含义:j的含义是当前背包的最大容量,dp[j]背包内物品的总价值确定递推公式:背包最大容量固定为j,每个循环尝试…

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

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

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

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

Milvus向量数据库:开启向量搜索新纪元

Milvus向量数据库:开启向量搜索新纪元 随着人工智能和机器学习技术的飞速发展,向量数据在各个领域的应用越来越广泛,如推荐系统、自然语言处理、计算机视觉等。在这样的背景下,如何高效地存储、查询和管理向量数据成为了一个重要的…