JVM专题四:JVM的类加载机制

Java中类的加载阶段

类加载

Java中的类加载机制是Java运行时环境的一部分,确保Java类可以被JVM(Java虚拟机)正确地加载和执行。类加载机制主要分为以下几个阶段:

  1. 加载(Loading):这个阶段,JVM会通过类加载器(ClassLoader)读取类的二进制数据(.class文件),并将其转换为方法区中的运行时数据结构。这个过程涉及到类的名称查找和字节码的加载。

  2. 验证(Verification):在链接阶段的第一步,JVM会确保加载的类符合JVM规范,没有安全问题。这个过程会检查字节码的格式是否正确,确保类的结构符合规范,比如确保所有方法调用都是有效的,没有非法访问等。

  3. 准备(Preparation):这个阶段,JVM会为类的静态变量分配内存,并设置默认初始值。比如,对于静态变量int x = 10;,JVM会在准备阶段为x分配内存,并将其初始化为0(因为10是一个编译时常量,所以最终的值会在初始化阶段被设置)

  4. 解析(Resolution):这个阶段涉及到将类、接口、字段和方法的符号引用转换为直接引用。符号引用是类文件中的一个名字,而直接引用是指向内存中的地址。解析过程确保了所有的符号引用都可以被正确地解析到它们所引用的实际对象。

  5. 初始化(Initialization):最后,JVM会执行类的构造器<clinit>()方法,这会按照代码中的顺序来初始化静态变量和静态初始化块。在这个阶段,静态变量会被赋予它们在代码中指定的值。

        整个类加载过程是由类加载器负责的,类加载器是Java运行时环境的一部分,负责加载.class文件,并确保类可以被JVM执行。类加载器还负责处理类之间的依赖关系,确保在加载一个类之前,它所依赖的类已经被加载。

Java类加载实例

public class App {public static void main(String[] args) {SpringApplication springApplication = new SpringApplication();}|

加载

        上述代码我简单改了下springboot的启动类,当我们运行main方法之间,类加载器会将App.class文件加载到JVM中,当运行main方法执行第一段代码的时候,就会将SpringApplication.class文件加载到JVM中,简单流程如下图。

好了,介绍完加载阶段我们思考一个小问题;如果我们随随便便给一个文件改个后缀名未.class文件那JVM还会处理吗?因此进入下一个阶段:

验证阶段

        上个阶段的问题答案肯定是否定的嘛?Java虚拟机会对class文件进行的规范约束,只有符合规范的文件才会被JVM处理。

通过验证以后的class文件才会进行处理,于是进入下一个阶段:

准备阶段

上述代码我们只有一个方法,实际很多类会有一些类变量,比如我们将上述代码改成:

public class App {public static int starter;public static void main(String[] args) {SpringApplication springApplication = new SpringApplication();}|

上述代码,假设我们是正常编码确认App.class是规范的即通过了验证阶段,便会进入准备工作。

这个阶段其实就是给这个“App”类分配一定内存空间给他的类变量分配内存并设置类变量的默认初始值如上述starter经过准备阶段会给一个’0‘的初始值,

类变量使用的内存都在方法区中分配。(这里提到初始化的是类变量,即static字段修饰,实例变量会在对象实例化时随对象一起分配在Java堆中。)

整个过程如下图:

解析阶段

这个阶段最最最主要的操作就是将符号引用替换为直接引用(类或接口、字段、类方法、接口方法、方法类型、方法句柄和访问控制修饰符7类符号引用),其实这部分实际都是由JVM底层处理的,涉及到c的处理过程。先不讨论,后面会抽一个专门说java与c的交互。

整个阶段就变成如下图:

符号引用与直接引用

        符号引用(Symbolic Reference) 是一种用来表示引用目标的符号名称,比如类名、字段名、方法名等。符号引用与实际的内存地址无关,只是一个标识符,用于描述被引用的目标,类似于变量名。符号引用是在编译期间产生的,在编译后的class文件中存储。

        直接引用(Direct Reference)是程序运行时JVM生成的,直接指向内存中对象或方法的实际地址的引用。这个过程涉及到查找类、接口、字段、方法等在内存中的实际位置(类似:0xfbe007)。

这稍微注意下上述三个阶段,我们会统一称之为链接阶段。

链接阶段需要重点注意的是准备阶段,在这个过程中我们给加载进来的内分配好了内存空间,类的变量也同样分配好了内存空间,并且给了默认初始值。这里再次强调一下后续会讨论分配内存空间时候各种情况,大家也可以自行思考下例如内存不够了咋整?多个人分配的地址重复了又该咋整呢?

初始化

上述我们在类加载的准备阶段给类的变量分配好内存空间后给类给的是默认值,而在初始化阶段就会正真执行类初始化代码

public class App {public static int starter = config.getStarter(); public static List<EnableAutoConfiguration> autoConfigurations;static {loadSpringFacotories();}public static void loadSpringFacotories(){autoConfigurations = new ArrayList();}public static void main(String[] args) {SpringApplication springApplication = new SpringApplication();}}

所以上述代码如果我们分不同阶段去获取starter其实会得倒不同的值,在加载进行到准备阶段我们得到的只会是0,而当我们在初始化后再去获取starter会获得到config.getStarter()方法返回的值。

当然这个阶段也会执行静态代码块里的方法,上述代码中的loadSpringFacotories()方法也是这个阶段调用的。

那什么时候会初始化一个类呢?通常有以下几个场景:

1、new的时候会将new后面的class文件从最开始的加载到初始化整个完整的过程都会执行一边,然后在实例化一个对象出来。

2、当执行一个入口函数如main(),就会把main所在的主类立马初始化

3、初始化一个类的时候发现他的父类没有初始化,那么就会先初始化他的父类。

结合例子我们最终完成整个加载过程的介绍,和第一个章节的知识点介绍,大家可以对比画出自己的图。

今天类加载机制到此就要结束了,后面我们会介绍类加载器与双亲委派机制;到时候加上类加载器上图又会变成怎样呢?

 专题汇总

JVM专题一:深入分析Java工作机制

JVM专题二:Java如何进行编译的

JVM专题三:Java代码如何运行

JVM专题四:JVM的类加载机制

JVM专题五:类加载器与双亲委派机制

JVM专题六:JVM的内存模型

JVM专题七:JVM垃圾回收机制

JVM专题八:JVM如何判断可回收对象

JVM专题九:JVM分代知识点梳理

JVM专题十:JVM中的垃圾回收机制

JVM专题十一:JVM 中的收集器一

JVM专题十二:JVM 中的收集器二

JVM专题十三:总结与整理(面试常用)

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

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

相关文章

聊一聊 C# 弱引用 底层是怎么玩的

一&#xff1a;背景 1. 讲故事 最近在分析dump时&#xff0c;发现有程序的卡死和WeakReference有关&#xff0c;在以前只知道怎么用&#xff0c;但不清楚底层逻辑走向是什么样的&#xff0c;借着这个dump的契机来简单研究下。 二&#xff1a;弱引用的玩法 1. 一些基础概念 …

如何判断一个Repo是否是Private还是Internal?

Github的Repository分为三种类型&#xff0c;主要是用于决定谁可以访问、查看和克隆该仓库。GitHub 提供了几种不同的可见性选项&#xff0c;包括 Private、Public 和 Internal。 Private 只有仓库的拥有者和被明确邀请为协作者&#xff08;Collaborator&#xff09;的用户才能…

论文速览 | IEEE Signal Processing Letters, 2024 | 基于时空上下文学习的事件相机立体深度估计

论文速览 | IEEE Signal Processing Letters, 2024 | 基于时空上下文学习的事件相机立体深度估计 1 引言 在计算机视觉领域,立体深度估计一直是一个备受关注的研究热点。传统的基于帧的方法虽然取得了长足的进步,但在处理运动模糊、低照度和平坦区域等挑战性场景时仍面临诸多…

如何利用俄罗斯VK Ads破解中俄贸易难题?

在当前全球经济环境下&#xff0c;中国与俄罗斯之间的贸易关系正面临着新的机遇和挑战。 特别是随着国际形势的变化&#xff0c;中俄两国的贸易往来日益频繁&#xff0c;中国企业机构出口至俄罗斯的业务也随之增多。 在这样的背景下&#xff0c;如何通过有效的市场推广策略&a…

番茄害虫数据集:助力农业害虫识别(目标检测)

亲爱的读者们&#xff0c;您是否在寻找某个特定的数据集&#xff0c;用于研究或项目实践&#xff1f;欢迎您在评论区留言&#xff0c;或者通过公众号私信告诉我&#xff0c;您想要的数据集的类型主题。小编会竭尽全力为您寻找&#xff0c;并在找到后第一时间与您分享。 一、引…

第二证券:近300亿资金抄底,低估值+高增长“错杀”股名单来了,仅11只

成绩表现优质公司或存在“错杀”的状况。 头部宽基ETF成交额继续放量&#xff0c;近300亿资金抄底 6月21日&#xff0c;上证指数跌破3000点后&#xff0c;商场谨慎情绪延伸&#xff0c;成交量继续走低&#xff0c;本周4个交易日均缺乏7000亿元。 关于3000点以下的地量行情&a…

【初学者必看】6个mp3剪辑工具分享,附上详细音频剪辑教程

MP3音频剪辑怎么操作呢&#xff1f;随着互联网的发展&#xff0c;大家都很喜欢从网上下载歌曲当作手机铃声&#xff0c;但是网上下载的歌曲时长太长&#xff0c;要怎么截取其中的一小部分当作铃声呢&#xff1f;还有些小伙伴想要将多个MP3音频剪辑拼接在一起&#xff0c;不知道…

易用且免费的在线3D交互编辑器?

目前市面上的在线3D交互编辑器&#xff0c;有收费、免费、永久免费的。 1、博维数孪&#xff1a;永久免费的在线3D数字孪生应用平台&#xff0c;用户可以轻松创作和分享多种应用类型&#xff0c;包括3D交互展示、3D产品目录、交互式动画、3D产品配置器、交互式演示文稿、在线商…

android AIDL使用demo

背景 最近打算学习一下如何在framework层添加一个自定义service。 了解到自定义service需要使用aidl&#xff0c;为了加强对aidl的了解和使用过程&#xff0c;特意又温习了一下aidl的使用&#xff0c;并用博客的形式记录下来。 aidl官方参考&#xff1a;https://developer.and…

【C++ 初阶路】--- 类和对象(末)

目录 一、const成员1.1 取地址及const取地址操作符重载 二、再谈构造函数2.1 构造函数体赋值2.2 初始化列表2.3 explicit关键字 三、static成员3.1 概念3.2 特性 四、友元4.1 友元函数4.2 友元类 五、内部类六、匿名对象 一、const成员 将const修饰的“成员函数”称之为const成…

多行业预约门店服务小程序源码系统 支持多门店预约 带完整的安装代码包以及搭建教程

系统概述 该系统基于先进的云计算和大数据技术&#xff0c;采用模块化设计&#xff0c;具有高度的可扩展性和可定制性。无论是餐饮、美容美发、健身房还是其他服务行业&#xff0c;都可以通过该系统轻松实现多门店预约功能。同时&#xff0c;我们还提供了丰富的接口和插件&…

Appium+python自动化(二十九)- 模拟手指在手机上多线多点作战 - 多点触控(超详解)

简介 在网页中我们经常使用缩放操作来便利的查看具体的信息&#xff0c;在appium中使用MultiAction多点触控的类来实现。MultiAction是多点触控的类&#xff0c;可以模拟用户多点操作。主要包含加载add()和执行perform()两个方法. 问题思考 在使用地图App中&#xff0c;我们…

Embedding 、词嵌入、向量模型说的是一回事么?AI是如何理解世界?AI人不能不看的Embedding白话科普!

在AI理解世界的过程中&#xff0c;向量模型扮演着一个至关重要的角色&#xff0c;甚至可以说它是AI大模型用以构建和理解复杂数据的基础&#xff0c;也是对不同形态数据的一种标准化的“浓缩”。它能够将语言、图像、声音等多样化的信息&#xff0c;转化为一种通用的、数学化的…

基于51单片机的银行排队呼叫系统设计

一.硬件方案 本系统是以排队抽号顺序为核心&#xff0c;客户利用客户端抽号&#xff0c;工作人员利用叫号端叫号&#xff1b;通过显示器及时显示当前所叫号数&#xff0c;客户及时了解排队信息&#xff0c;通过合理的程序结构来执行排队抽号。电路主要由51单片机最小系统LCD12…

Vue-cli项目及Element UI 环境搭建 保姆级教程

一、Vue-cli介绍及其作用 什么是Vue-cli手脚架 vue-cli 官方提供的一个脚手架&#xff0c;用于快速生成一个 vue 的项目模板&#xff1b;预先定义 好的目录结构及基础代码&#xff0c;就好比咱们在创建 Maven 项目时可以选择创建一个 骨架项目&#xff0c;这个骨架项目就是脚…

手把手教你玩转AD9361数字调制解调系列(二) ----纯逻辑实现FSK信号的数字调制解调

因最近客户需求&#xff0c;用纯PL实现AD9361的数字信号调制解调&#xff0c;于是就把各种数字调制都在AD9361上都实现了一遍。优点就是&#xff1a;既可以在zynq系列上配置9361&#xff0c;也可以在纯FPGA系列配置9361。并且理解起来比较简单&#xff01;&#xff01;&#xf…

lidar3607.2 雷达点云数据处理软件功能介绍

LiDAR360 是北京数字绿土科技股份有限公司自主研发的点云后处理及行业应用软件。平台可处理 TB 级点云数据&#xff0c;并拥有 10 余种国际领先的点云处理及 AI 算法&#xff0c;推动激光雷达 的多行业应用。700 余项强大且灵活的功能&#xff0c;解决用户最后一公里的应用难题…

云仓是如何发展起来的?

1、电子商务的繁荣&#xff1a; 随着电商的兴起&#xff0c;对高效仓储和物流的需求越来越大。传统的仓储方式难以满足海量订单处理和快速配送的要求&#xff0c;因此需要一种更加灵活和高效的仓储解决方案。 ------------------------------------------------- 2、科技进步…

罗盘复杂网络教程—3步轻松构建社团检测任务

作为复杂网络领域中重要的课题之一&#xff0c;社团检测有助于揭示网络中存在的功能性模块或群集&#xff0c;旨在于仅利用网络中蕴含的来识别模块&#xff0c;并可能进而识别它们的层次组织。社团检测在各个领域具有重要的应用&#xff0c;可以帮助深入理解复杂系统潜在的模式…

一键进阶ComfyUI!懂AI的设计师现在都在用的节点式Stable Diffusion

前言 _ 万字教程&#xff01;奶奶看了都会的 ComfyUI 入门教程 推荐阅读 一、川言川语 大家好&#xff0c;我是言川。 阅读文章 > ](https://www.uisdc.com/comfyui-3) 目前使用 Stable Diffusion 进行创作的工具主要有两个&#xff1a;WebUI 和 ComfyUI。而更晚出现的…