JVM类加载机制

Java中类的加载阶段分为加载、链接和初始化。其中连接过程又包含了验证、准备和解析。

加载

加载阶段的目的是将类的.class文件加载到JVM中。 在这个阶段,JVM会根据类的全限定名来获取定义该类的二进制字节流,并将这个字节流所代表的静态存储结构转换为方法区的运行时数据结构。

加载过程会创建一个java.lang.Class类的实例来表示这个类。这个Class对象作为程序中每个类的数据访问入口。

链接阶段

在链接阶段,**Java类加载器对类进行验证、准备和解析操作。**将类与类的关系(符号引用转为直接引用)确定好,校验字节码

1.验证:校验类的正确性(文件格式,元数据,字节码,二进制兼容性),保证类的结构符合JVM规范。

2.准备:为类变量分配内存并设置类变量的默认初始值,这些变量使用的内存都在方法区中分配。(这里初始化的是类变量,即static字段,实例变量会在对象实例化时随对象一起分配在Java堆中。)

3.解析:把类的符号引用转为直接引用(类或接口、字段、类方法、接口方法、方法类型、方法句柄和访问控制修饰符7类符号引用)

初始化

初始化是类加载的最后一步,也是真正执行类中定义的Java程序代码(字节码),初始化阶段是执行类构造器<clinit>()方法的过程。 这里利用了一种懒加载的思想 ,所有Java虚拟机实现必须在每个类或接口被Java程序首次主动使用时才初始化,但类加载不一定,静态代码块在类初始化时执行

1.new一个类,读取一个静态字段(未被final修饰)、或调用一个类的静态方法时会进行类的初始化

2.使用java. lang. reflect包的方法对类进行反射调用时,如果类没初始化,需要触发其初始化

3.初始化一个类,如果其父类还未初始化,则先触发该父类的初始化

4.当虚拟机启动时,用户需要定义一个要执行的主类(包含 main方法的那个类),虚拟机会先初始化这个类

什么是符号引用和直接引用

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

直接引用是实际指向目标的内存地址 ,比如类的实例、方法的字节码 等。直接引与具体的存地址相关,是在程序运行期间动态生成的。

相关推荐
她的男孩1 分钟前
页面已发布用户仍进不去:Forge Admin 门户入口与系统菜单挂载解耦
java·spring boot·低代码
不像程序员的程序媛5 分钟前
mybatisplus insert dto未指定id时会如何
java·开发语言
我命由我1234524 分钟前
5-2.Python 编码进阶 - 字符串进阶(拼接、普通格式化、普通格式化数字精度控制、快速格式化、遍历、常用方法)
java·开发语言·后端·python·学习·java-ee·学习方法
Pniubi8 小时前
HashMap的扩容和树化边界
java·开发语言
Mikko79 小时前
用 Java 复刻了高中时在塞班上玩的「熔岩矿车」:纯 Swing、零依赖、没有一张图片,一个 jar 双击就能玩
java·游戏开发·swing
知了学历孙老师9 小时前
小自考的校考和统考,出题方和难度差在哪
java·大数据·前端
Java爱好狂.9 小时前
Java初学者如何一周速通SpringBoot!
java·spring boot·后端·spring·高并发·架构师·java面试
秋饼10 小时前
LLM API密钥动态轮换实战:Spring Vault + Spring AI + 多Provider路由
java·ai·技术分享·后端开发
福兮说11 小时前
JSON 格式正确,数据就可靠吗?我用一份自编配置检查类型与空值
java·前端·json
小天源13 小时前
从 Nginx 日志到访问分析:轻量化网站监测服务的架构实践
jvm·nginx·网络安全·架构·网络监控