首页 > 其他分享 >类加载过程详解

类加载过程详解

时间:2024-04-02 16:31:03浏览次数:22  
标签:初始化 变量 静态 详解 引用 JVM 过程 final 加载

1、加载

  • 通过类的全名,获取类的二进制数据流。
  • 解析类的二进制数据流为方法区内的数据结构(Java类模型) 
  • 创建java.lang.Class类的实例,表示该类型。作为方法区这个类的各种数据的访问入口 

2、验证 

验证类是否符合JVM规范,安全性检查 

  • 文件格式验证:是否符合Class文件的规范 
  • 元数据验证
这个类是否有父类(除了Object这个类之外,其余的类都应该有父类)这个类是否继承(extends)了被final修饰过的类(被final修饰过的类表示类不能被继承)类中的字段、方法是否与父类产生矛盾(被final修饰过的方法或字段是不能覆盖的)
  • 字节码验证
主要的目的是通过对数据流和控制流的分析,确定程序语义是合法的、符合逻辑的。
  • 符号引用验证
符号引用以一组符号来描述所引用的目标,符号可以是任何形式的字面量

3、准备

为类变量分配内存并设置类变量初始值

  • static变量,分配空间在准备阶段完成(设置默认值),赋值在初始化阶段完成 
  • static变量是final的基本类型,以及字符串常量,值已确定,赋值在准备阶段完成 
  • static变量是final的引用类型,那么赋值也会在初始化阶段完成

4、解析

把类中的符号引用转换为直接引用:将字节码文件中的#+数字(符号引用)转换为具体的类和方法(直接引用)

5、初始化

对类的静态变量,静态代码块执行初始化操作

  • 如果初始化一个类的时候,其父类尚未初始化,则优先初始化其父类。 
  • 如果同时包含多个静态变量和静态代码块,则按照自上而下的顺序依次执行。

6、使用

JVM 开始从入口方法开始执行用户的程序代码

  • 调用静态类成员信息(比如:静态字段、静态方法) 
  • 使用new关键字为其创建对象实例 

7、卸载

当用户程序代码执行完毕后,JVM 便开始销毁创建的 Class 对象,最后负责运行 的 JVM 也退出内存

标签:初始化,变量,静态,详解,引用,JVM,过程,final,加载
From: https://blog.csdn.net/weixin_66196770/article/details/137226495

相关文章

  • 面向对象14:static关键字详解
    ackagecom.oop.demo07;publicclassStudent{//staticprivatestaticintage;//静态变量多线程里会用到privatedoublescore;//非静态变量publicstaticvoidmain(String[]args){Students1=newStudent();System.out.p......
  • ES6 reduce方法:示例与详解、应用场景
    还是大剑师兰特:曾是美国某知名大学计算机专业研究生,现为航空航海领域高级前端工程师;CSDN知名博主,GIS领域优质创作者,深耕openlayers、leaflet、mapbox、cesium,canvas,webgl,echarts等技术开发,欢迎加底部微信(gis-dajianshi),一起交流。No.内容链接1Openlayers【入门教程】-......
  • 一步到位!快速精通Git工作流及实战技巧详解
    Git是一个分布式版本控制系统。1、git的应用场景1.备份小明负责的模块就要完成了,就在即将release之前的一瞬间,电脑突然蓝屏。硬盘光荣牺牲!几个月来的努力付之东流。场景二:代码还原这个项目中需要一个很复杂的功能,老王摸索了一个星期终于有眉目了,可是这被改得面目全非的......
  • MAT确认导致OOM的具体功能表单的过程
    MAT发现导致OOM的具体功能表单的过程背景愚人节这一天公司项目出现了大量FullGC的情况.群里发出来之后这边进行了一些简单的问题查找.堆区设置的事30G然后dump文件是35G左右.下载和解压缩耗时15min使用40G堆区全闪的Window虚拟机进行解析耗时30分钟.最近自己眼......
  • 关于EF延时加载的面试题
    publicasyncTask<ActionResult>GetData(){vardata=(fromleftdatainGetLeft()joinrightdatainGetRight()onleftdata.Idequalsrightdata.Idintotempdatafrommatchdataintempdata.DefaultIfE......
  • 在React中实现图片懒加载
    在React中实现图片懒加载,可以使用第三方库,如react-lazy-load。以下是一个简单的例子,使用react-lazy-load实现图片懒加载。首先,安装react-lazy-load-image-component库:bashnpminstallreact-lazy-load-image-component然后,在React组件中使用:jsximportReactfrom'react';impo......
  • HTTP协议格式详解之首行信息解析
    HTTP(HypertextTransferProtocol)是一种用于传输超文本文档的应用层协议,通常用于在客户端和服务器之间传输网页、图片、视频等资源。它是建立在TCP/IP协议栈之上的应用层协议,使用标准的TCP连接来传输数据。HTTP的主要特点包括简单、灵活、可扩展性强等。在OSI(OpenSystemsInt......
  • mysql存储过程编写步骤
    1.创建存储过程DELIMITER$$  #将语句的结束符号从分号;临时改为2个$$(可以是自定义的)CREATEPROCEDUREProc()#创建存储过程,过程名为Proc,不带参数BEGIN #存储过程,以BEGIN关键字开......
  • 提升工作效率:B端工作台设计基础详解
    随着互联网和信息技术的快速发展,越来越多的企业开始以数字化、智能化的方式管理和运营自己的业务。B端工作台设计作为企业应用的重要组成部分,越来越受到重视。本文将从三个方面对B端工作台设计进行全面分析。让我们看看。1.B端工作台设计原则B端工作台设计应符合以下原则:1.......
  • Linux研究(6):Linux 硬链接和软连接-详解
    导言:当涉及到Linux文件系统中的链接时,有两种常见类型:硬链接(HardLink)和软链接(SymbolicLink,也称为符号链接或软连接)。它们用于在文件之间创建关联,提供了一些非常有用的功能。下面是对硬链接和软链接的详细解释以及一个实验样例。1.硬链接(HardLink)硬链接是通过文件系统......