JVM原理(十二):JVM虚拟机类加载过程

一个类型从被加载到虚拟机内存中开始,到卸载为止,它的整个生命周期将会经过 加载、验证、准备、解析、初始化、使用、卸载七个阶段。其中 验证、准备、解析三个部分统称为 连接

1. 加载

加载是整个类加载的一个过程。在加载阶段,Java虚拟机需要完成三件事情:

  • 通过一个类的全限定名来获取定义此类的二进制字节流。

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

  • 在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口(生成在方法区,相当于模板)。

因为Java虚拟机对着三点要求不是特别具体,没有指明二进制字节流必须得从某个Class文件中获取,确切的说根本没有说从哪里获取,怎么获取,所以开发人员玩出了各种花样。

  •  从ZIP压缩包中读取,这很常见,最终成为日后JAR、EAR、WAR格式的基础。
  • 从网络中获取,这种场景最典型的应用就是WebApplet。
  • 运行时计算生成,这种场景使用得最多的就是动态代理技术,在javalangreect.Proxy中,就是用了ProxyGenerator.gnerateProxyClass()来为特定接口生成形式为“*SProxy”的代理类的二进制字节流。
  • 由其他文件生成,典型场景是JSP应用,由ISP文件生成对应的Class文件。
  • 从数据库中读取,这种场景相对少见些,例如有些中间件服务器(如SAPNetweaver)可以选择把程序安装到数据库中来完成程序代码在集群间的分发。
  • 可以从加密文件中获取,这是典型的防Class文件被反编译的保护措施,通过加载时解密Class文件来保障程序运行逻辑不被窥探。 

数组类

对于数组类而言,情况就有所不同,数组类本身不通过类加载器创建,它是由Java虛拟机直接在内存中动态构造出来的。但数组类与类加载器仍然有很密切的关系,因为数组类的元素类型 (ElementType,指的是数组去掉所有维度的类型) 最终还是要靠类加载器来完成加载,一个数组类(下面简称为C)创建过程遵循以下规则:

  1.  如果数组的组件类型(Componcnt Typc,指的是数组去掉一个维度的类型,注意和前面的元素类型区分开米)是引用类型,那就递归采用本节中定义的加载过程去加载这个组件类型,数组C将被标识在加载该组件类型的类加载器的类名称空间上(这点很重要,在7.4节会介绍,一个类型必须与类加载器一起确定唯一性)。
  2. 如果数组的组件类型不是引用类型(例如int]数组的组件类型为int),Java虚拟机将会把数组C标记为与引导类加载器关联。
  3. 数组类的可访问性与它的组件类型的可访问性一致,如果组件类型不是引用类型,它的数组类的可访问性将默认为public,可被所有的类和接口访问到。

总结

加载阶段与连接阶段的部分动作(如一部分字节码文件格式验证动作)是交叉进行的,加载阶段尚未完成,连接阶段可能已经开始,但这些夹在加载阶段之中进行的动作,仍然属于连接阶段的一部分,这两个阶段的开始时间仍然保持着固定的先后顺序。

2. 验证

目的是确保Class文件的字节流包含的信息符和《Java虚拟机规范》的全部约束要求,保证信息被当作代码运行后不会危害虚拟机自身安全。


验证过程:文件格式验证、元数据验证、字节码验证和符号引用验证。

2.1. 文件格式验证

第一阶段要验证字节流是否符合Class文件格式的规范,并且能被当前版本的虚拟机处理。

2.2. 元数据验证

元数据:元数据是指用来描述数据的数据,更通俗一点,就是描述代码间关系,或者代码与其他资源(例如数据库表)之间内在联系的数据。

第一, 元数据以标签的形式存在于Java代码中。
​
第二, 元数据描述的信息是类型安全的,即元数据内部的字段都是有明确类型的。
​
第三, 元数据需要编译器之外的工具额外的处理用来生成其它的程序部件。
​
第四, 元数据可以只存在于Java源代码级别,也可以存在于编译之后的Class文件内部。

 JDK5.0出来后,java语言中就有了四种类型(TYPE),即类(class)、枚举(enum)、接口(interface)和注解(@interface),它们是处在同一级别的。java就是通过注解来表示元数据的。

主要目的是对类的元数据信息进行语义校验,保证不存在与《Java语言规范》定义相勃的元数据信息。

总结

验证阶段对于虚拟机的类加载机制来说,是一个非常重要的、但却不是必须要执行的阶段,因为验证阶段只有通过或者不通过的差别,只要通过了验证,其后就对程序运行期没有任何影响了。如果程序运行的全部代码(包括自己编写的、第三方包中的、从外部加载的、动态生成的等所有代码)都已经被反复使用和验证过,在生产环境的实施阶段就可以考虑使用-Xverify: none参 数来关闭大部分的类验证措施,以缩短虚拟机类加载的时间。

3. 准备

准备阶段是正式为类中定义(即静态变量,被static修饰的变量)分配内存并设置类变量初始值的阶段。

4. 解析

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


符号引用和直接引用

符号引用:

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

直接引用:

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


解析动作主要针对:类或接口、字段、类方法、接口方法、方法类型、方法句柄和调用点限定符这7类符号引用进行。

5. 初始化

直到初始化阶段,Java虚拟机才真正开始执行类中编写的Java程序代码,将主导权移交给应用程序。

初始化含义:根据程序员通过程序编码制定的主观计划去初始化类变量和其他资源。也可以理解初始化阶段就是执行类构造器<clinit>()方法的过程。

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

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

相关文章

使用python编程的视频文件列表应用程序

简介&#xff1a; 在本篇博客中&#xff0c;我们将介绍一个基于 wxPython 的视频文件列表应用程序。该应用程序允许用户选择一个文件夹&#xff0c;并显示该文件夹中的视频文件列表。用户可以选择文件并查看其详细信息&#xff0c;导出文件列表为文本文件&#xff0c;以及播放…

Spring系统学习-什么是AOP?为啥使用AOP?

问题思考 我们为啥要使用AOP? 来看一个案例&#xff1a; 声明计算器接口Calculator&#xff0c;包含加减乘除的抽象方法 public interface Calculator {int add(int i, int j);int sub(int i, int j);int mul(int i, int j);int div(int i, int j); }public class Calculat…

JS(JavaScript)数据校验 表单校验-案例

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

【Rust入门】生成随机数

文章目录 前言随机数库rand添加rand库到我们的工程生成一个随机数示例代码 总结 前言 在编程中&#xff0c;生成随机数是一种常见的需求&#xff0c;无论是用于数据分析、游戏开发还是模拟实验。Rust提供了强大的库来帮助我们生成随机数。在这篇文章中&#xff0c;我们将通过一…

顺序表--续(C语言详细版)

2.9 在指定位置之前插入数据 // 在指定位置之前插入数据 void SLInsert(SL* ps, int pos, SLDataType x); 步骤&#xff1a; ① 程序开始前&#xff0c;我们要断言一下&#xff0c;确保指针是有效的&#xff0c;不是NULL&#xff1b; ② 我们还要断言一下&#xff0c;指定的…

ctfshow sql注入 web234--web241

web234 $sql "update ctfshow_user set pass {$password} where username {$username};";这里被过滤了&#xff0c;所以我们用\转义使得变为普通字符 $sql "update ctfshow_user set pass \ where username {$username};";那么这里的话 pass\ where…

libtorch+torchvision windows编译

libtorch建议直接采用官方的预编译版本,对应好torchvision版本做编译。 1. libtorch预编译版本下载 libtorch官方下载地址 Pybind11编译 git clone https://github.com/pybind/pybind11.git cd pybind11 mkdir build (base) PS E:\project\pybind11-2.13.1> cd .\build…

小程序-<web-view>嵌套H5页面支付功能

背景&#xff1a;小程序未发布前&#xff0c;公司使用vue框架搭建了管理系统&#xff0c;为了减少开发成本&#xff0c;微信提供了web-view来帮助已有系统能在小程序上发布&#xff0c;详见web-view | 微信开放文档。因公司一直未打通嵌套H5小程序的支付功能&#xff0c;导致用…

AIGC对设计行业的影响与启发:AIGC设计能替代真正的设计师吗?

随着科技的飞速发展&#xff0c;人工智能生成内容&#xff08;AIGC&#xff09;技术在设计行业的应用日益广泛&#xff0c;引发了广泛的讨论和关注。AIGC以其高效、多样化的生成能力&#xff0c;为设计行业带来了前所未有的变革。然而&#xff0c;关于AIGC是否能替代真正的设计…

开源模型应用落地-FastAPI-助力模型交互-WebSocket篇(一)

一、前言 使用 FastAPI 可以帮助我们更简单高效地部署 AI 交互业务。FastAPI 提供了快速构建 API 的能力,开发者可以轻松地定义模型需要的输入和输出格式,并编写好相应的业务逻辑。 FastAPI 的异步高性能架构,可以有效支持大量并发的预测请求,为用户提供流畅的交互体验。此外,F…

Python 生成Md文件带超链 和 PDF文件 带分页显示内容

software.md # -*- coding: utf-8 -*- import os f open("software.md", "w", encoding"utf-8") f.write(内部测试版2024 MD版\n) for root, dirs, files in os.walk(path): dax os.path.basename(root)if dax "":print("空白…

从 ClickHouse 到 Apache Doris:快成物流的数智化货运应用实践

导读&#xff1a;随着快成物流的大宗商品产业链的不断发展&#xff0c;货运轨迹规划和实时数据分析的需求日益迫切&#xff0c;为了保障数据报表更新、用户画像圈选与物流轨迹实时更新等大数据核心系统性能&#xff0c;快成物流引入 Apache Doris 实时数仓升级了大数据算法平台…

这才叫必备软件推荐 你不能不知道的mac软件 Mac上有什么实用的必备软件 Mac常用必备软件推荐 一些好用的Mac软件

Mac OS是一个类Unix系统&#xff0c;内置终端Shell&#xff0c;这使得它天生就适合为程序员、开发者、设计者所用。不得不说苹果对用户体验的追求已经到了极致。遂开本篇&#xff0c;由于应用众多&#xff0c;一锅炖不下&#xff0c;故打算做一个系列。 下面为大家一一介绍一些…

基于物品的协同过滤算法

预估用过户对候选物品的兴趣 计算物品相似度 召回通道 快速做召回条件

Unity2D - 状态机(State Machine)详解

1. 状态机概述 在角色的生成中&#xff0c;由于事件的不同&#xff0c;动作的不同&#xff0c;角色会处于不同的状态中。例如对战冒险游戏&#xff0c;面临Boss的攻击&#xff0c;角色会受到例如中毒&#xff0c;恐惧等Debuff效果&#xff0c;若单纯的在一个脚本中使用if等语句…

绝地求生PUBG怎么领取补偿G币 补偿G币什么时候到账

绝地求生这款大逃杀射击游戏相信大家都不陌生&#xff0c;在之前的新版本NewJeans联动中&#xff0c;由于一些官方设定的错误&#xff0c;导致在开典藏箱的时候出现了一些问题&#xff0c;官方也推出了相应的补偿措施&#xff0c;比如退还G币&#xff0c;回收典藏箱子开出来的东…

Linux之Uboot简介和移植

uboot简介 uboot 的全称是 Universal Boot Loader&#xff0c;uboot 是一个遵循 GPL 协议的开源软件&#xff0c;uboot是一个裸机代码&#xff0c;可以看作是一个裸机综合例程。现在的 uboot 已经支持液晶屏、网络、USB 等高级功能。 也就是说&#xff0c;可以在没有系统的情况…

绝区零国际服怎么下载 绝区零国际服下载教程

绝区零即将上线&#xff0c;每位玩家都能在这里开启全新的时空冒险之旅&#xff0c;主要玩法分为以剧情和副本为主的核心玩法、以刷材料为主的养成副本&#xff0c;以及日常任务为主&#xff0c;在以往的手游中&#xff0c;玩家进入某项玩法只需要从游戏界面调取菜单即可&#…

如何用简单的html,css,js写出一个带有背景层的删除弹出框

虽然每次项目都是主要写后端&#xff0c;但是有时候前端的样式太丑了&#xff0c;也有点看不下去。弹出框是项目中用的比较多的&#xff0c;比如删除&#xff0c;修改或者添加什么的&#xff0c;都需要一个弹出框。 所以这里简单记录一下&#xff0c;应该如何实现。实现效果如…

软考《信息系统运行管理员》-2.3信息系统运维的外包

2.3信息系统运维的外包 信息系统运维外包的概念/模式 也称为信息系统代维。是指信息系统使用单位将全部或一部分的信息系统维护服务工作&#xff0c;按照规定的维护服务要求&#xff0c;外包委托给专业公司管理。 完全外包运维模式部分外包模式 信息系统运维外包的好处 有利…