【JVM基础08】——类加载器-说一下类加载的执行过程?

目录

  • 1- 引言:类加载的执行过程
    • 1-1 类加载的执行过程是什么?(What)
  • 2- ⭐核心:详解类加载的执行过程(How)
    • 2-1 加载——>加载到运行时数据区
    • 2-2 验证——>类的安全性检查
    • 2-3 准备——>为类变量分配内存并设置初始值
    • 2-4 解析——>把类中的符号引用转为直接引用
    • 2-5 初始化——>对静态变量和静态代码块进行初始化
    • 2-6 使用
    • 2-7 卸载
  • 3-小结
    • 3-1 类装载的执行过程


1- 引言:类加载的执行过程

1-1 类加载的执行过程是什么?(What)

  • 类从加载到虚拟机中开始,直到卸载为止,它的整个生命周期包括了:①加载、②验证、③准备、④解析、⑤初始化、⑥使用和 ⑦卸载这 7 个阶段。其中,验证,准备和解析这三个部分统称为连接(linking)

image.png


2- ⭐核心:详解类加载的执行过程(How)

2-1 加载——>加载到运行时数据区

image.png

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

举例说明

  • 假设现在有一个 Person 类,当 Person 类被加载之后就会存到 JVM 的运行时数据区,主要涉及运行时数据区的两个部分进行存储。
    • ① 方法区/元空间:存储的是这个类的信息,比如 Person 类的构造函数、方法、字段等信息。其实就是目前的元空间
    • ② 堆:堆中会开辟一段空间去存储当前类的 Class 对象,用于创建具体的 Class 对象时使用。比如此时创建了两个实例对象 ,此时这两个实例对象的对象头都会指向当前这个 Class 对象。但具体的类的构造函数、方法、字段等信息,需要到方法区中去获取,此时堆中的 Class 对象就可以找到方法区中的的这些类信息。

image.png


2-2 验证——>类的安全性检查

image.png

  • ①主要是格式检查,检查文件格式是否错误、语法是否错误、字节码是否合规
  • ②符号引用验证:Class文件在其常量池会通过字符串记录自己将要使用的其他类或方法,检查他们是否存在

验证主要负责检查类是否符合 JVM 规范

  • (1)文件格式验证
  • (2)元数据验证
  • (3)字节码验证
  • (4)符号引用验证

image.png


2-3 准备——>为类变量分配内存并设置初始值

准备阶段主要是对类的变量进行复制,也就是带有 static 关键字的变量。赋值情况主要分为以下三种

  • ① static 变量,分配空间在准备阶段完成(设置默认值),赋值在初始化阶段完成
    • 比如 static int b = 10赋默认值是 0 ,在初始化阶段才赋值为 10
  • ② static 变量是 final 的基本类型,以及字符串常量,值已经确定,赋值在准备阶段完成
    • 比如 下面代码中的变量 c 和 d ,带了 final 修饰符,此时在准备阶段就完成了赋值
  • ③ static 变量是 final的 引用类型,那么赋值也会在初始化阶段完成
    • 比如 static final Object obj = new Object(),其中 Object 是引用数据类型,因此在初始化阶段才会完成赋值
public class Application {static int b = 10;static final int c = 20;static final String d = "hello";static final Object obj = new Object();
}

2-4 解析——>把类中的符号引用转为直接引用

image.png
比如:方法中调用了其他方法,方法名可以理解为符号引用,而直接引用就是使用指针直接指向方法。
image.png

  • 符号引用(Symbolic Reference):这是一种抽象的引用形式,使用一组符号来描述所引用的目标。它可以是任何形式的字符串描述,如完全限定名、方法名称和描述符组合等。符号引用并不直接指向对象在内存中的地址。
  • 直接引用(Direct Reference):这是转换后的引用,直接指向目标的内存地址或者对目标的直接指针。直接引用是在解析阶段生成的,当符号引用被第一次使用时,它会被转换为直接引用。

解析是指将类文件中的符号引用转换为直接引用的过程。这个转换过程是 JVM 执行的一部分,确保了程序的执行效率和安全性。


2-5 初始化——>对静态变量和静态代码块进行初始化

image.png

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

2-6 使用

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

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

2-7 卸载

  • 就是说当用户程序代码执行完毕之后, JVM 就开始销毁创建的 class 对象了,这时候就相当于把类已经给卸载了。

3-小结

3-1 类装载的执行过程

在这里插入图片描述

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

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

相关文章

Web网页端IM产品RainbowChat-Web的v7.1版已发布

一、关于RainbowChat-Web RainbowChat-Web是一套Web网页端IM系统,是RainbowChat的姊妹系统(RainbowChat是一套基于开源IM聊天框架 MobileIMSDK (Github地址) 的产品级移动端IM系统)。 ► 详细介绍:http://www.52im.net/thread-2…

每天一个设计模式之职责链模式(第一天)

特别感谢刘伟老师,看他的书我学到了很多东西,从今天开始我要开始更新啦! 在csdn个人博客来总结知识,把他们变成自己的能力。 对三,要不起,张三李四王五几个人在玩斗地主,过过过,一…

Codeforces Round 962 (Div. 3)

链接 C题&#xff1a; 思路&#xff1a; 直接暴力求每个字母的前缀和&#xff0c;对于区间l&#xff0c;r的最小操作就是区间不同数的一半&#xff0c;因为可以把一个数变成另一个不一样的数&#xff0c;一下抵消两个。 #include<bits/stdc.h> using namespace std; //…

MySQL中不等于筛选时会漏掉null值的问题

一、问题描述 MySQL中使用不等于进行筛选数据时&#xff0c;若筛选值为null&#xff0c;则该条数据不会被选中&#xff0c;如何解决该问题&#xff1f; 表示不等于的方式如下&#xff1a; ! <> not in二、案例验证 1、创建数据表 -- ---------------------------- -…

【2024最新版】Stable diffusion汉化版安装教程(附SD安装包),一键激活,永久免费!

目前广泛使用的Stable Diffusion Web UI简称(SDWebUI)是发布在开源平台Github上的一个Python项目,与通常的软件安装方法不同,这个项目并不是下载并安装即可使用的应用程序,而是需要准备执行环境,编译源码. 如果你是一个新手不会安装,现在可以直接使用一键启动包. 例如:国内的…

AI驱动的在线面试系统:技术革新与初步面试的新体验

一、引言 在数字化和智能化的时代背景下&#xff0c;人工智能&#xff08;AI&#xff09;技术正日益渗透到各行各业&#xff0c;为人们的生活和工作带来前所未有的变革。其中&#xff0c;AI驱动的在线面试系统&#xff0c;凭借其高效、便捷、公正等特性&#xff0c;逐渐成为企业…

ATF-541M4全解析(一)

目录 一、描述二、规格三、各参数最大值四、25℃下的典型值 一、描述 安华高科技 (Avago Technologies) 的 ATF-541M4 是一款高线性度、低噪声、单电源供电的E-PHEMT&#xff0c;封装在一个微型无引脚封装中。 ATF-541M4 的小尺寸和低外形使其非常适合用于混合模块和其他空间…

matplotlib 画图函数,最常用的

并排显示2个图片 import os import numpy as np from PIL import Image import matplotlib.pyplot as pltimage1 Image.open(a.png) image2 Image.open(a2.png)# Create a figure with two subplots (1 row, 2 columns) fig, axes plt.subplots(1, 2, figsize(10, 5))# Di…

【Git-驯化】一文搞懂git中rm命令的使用技巧

【Git-驯化】一文搞懂git中rm命令的使用技巧 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 免费获取相关内容文档关注&#xff1a;微信公…

git学习笔记(总结了常见命令与学习中遇到的问题和解决方法)

前言 最近学习完git&#xff0c;学习过程中也遇到了很多问题&#xff0c;这里给大家写一篇总结性的博客&#xff0c;主要大概讲述git命令和部分难点问题&#xff08;简单的知识点这里就不再重复讲解了&#xff09; 一.git概述 1.1什么是git Git是一个分布式的版本控制软件。…

【推研小灶】复旦与南大之间:一次独特的计算机保研之旅

写在前面 上午10点填完志愿等待复试通知&#xff0c;利用这段时间记录一下我简短的夏令营和预推免。今年变为线下之后&#xff0c;部分学校的入营情况、考核方式有明显变化。加上CS方向保研名额总体变多&#xff0c;形势有点小乱&#xff0c;甚至填报系统都在9.29中秋节当天&a…

嵌入式C++、Raspberry Pi、LoRa和Wi-Fi技术、TensorFlow、ROS/ROS2:农业巡检数据导航机器人设计流程(代码示例)

随着科技的不断进步&#xff0c;农业领域也在逐渐向智能化发展。农业巡检机器人作为农业智能化的重要组成部分&#xff0c;能够自动化地监测农作物生长状况&#xff0c;提高农业管理的效率和精确度。本文将介绍一个基于Raspberry Pi和NVIDIA Jetson的农业巡检机器人&#xff0c…

【我的养猪日记】区块链游戏

剧情介绍 年少无知留给了故乡&#xff0c;谦卑有礼送给了远方&#xff0c;有工作的地方没家&#xff0c;有家的地方没工作&#xff0c;他乡留不下灵魂&#xff0c;故乡安不了肉身&#xff0c;从此便有了漂泊。在外漂泊数年的你每天过着&#xff0c;挤不完的公交地铁、交不完的房…

VUE3学习第三篇:报错记录

1、在我整理好前端代码框架后&#xff0c;而且也启动好了对应的后台服务&#xff0c;访问页面&#xff0c;正常。 2、报错ReferenceError: defineModel is not defined 学到这里报错了 在vue网站的演练场&#xff0c;使用没问题 但是在我自己的代码里就出问题了 3、watchEffec…

网友提问:桌面与web开发哪个难度更大?

关于桌面应用开发与Web开发哪个难度更大的问题&#xff0c;实际上并没有绝对的答案&#xff0c;因为这取决于具体的开发任务、所使用的工具和技术栈等因素。不过&#xff0c;我们可以从几个方面来进行比较&#xff1a; 技术栈 Web开发&#xff1a; 前端通常涉及到HTML、CSS、J…

用Python编写自动答题脚本——该如何写呢?

编写一个Python自动答题脚本的复杂性和方法将取决于你所要答题的系统的具体实现和限制。以下是一个简化的流程&#xff0c;以及如何在不同情境下编写自动答题脚本的基本思路。 1. 确定答题系统的交互方式 首先&#xff0c;你需要了解答题系统是如何与用户交互的。这可能包括&…

Django—admin后台管理

Django官网 https://www.djangoproject.com/ 如果已经有了Django跳过这步 安装Django&#xff1a; 如果你还没有安装Django&#xff0c;可以通过Python的包管理器pip来安装&#xff1a; pip install django 创建项目&#xff1a; 使用Django创建一个新的项目&#xff1a; …

[Mysql-DDL数据操作语句]

目录 DDL语句操作数据库 库&#xff1a; 查看&#xff1a;show 创建&#xff1a;creat 删除&#xff1a;drop 使用(切换)&#xff1a;use 表&#xff1a; 查看&#xff1a;desc show 创建&#xff1a;create 表结构修改 rename as add drop modify change rename as …

探索Linux-1-虚拟机远程登陆XShell6远程传输文件Xftp6

Linux是什么&#xff1f; Linux是一个开源的操作系统内核&#xff0c;由林纳斯托瓦兹&#xff08;Linus Torvalds&#xff09;于1991年首次发布。它基于Unix操作系统&#xff0c;但提供了更多的自由和灵活性。Linux内核是操作系统的核心部分&#xff0c;负责管理系统资源、处理…

MySQL的表,视图,索引创建

一。创建表 1。创建Student表 mysql> create table Student(Sno int primary key auto_increment,Sname varchar(30) not null unique,Ssex varchar(2) check (Ssex 男 or Ssex 女) not null,Sage int not null,Sdept varchar(10) default 计算机 not null); 2.创建Cour…