【Java ee初阶】jvm(2)

类加载机制:

JVM从最开始的读取.class文件,到最终构造完成 类 对象的整个过程,也就是把 类 从硬盘 加载到内存中的机制。

Java的类加载机制主要分为五个步骤:加载、验证、准备、解析和初始化。

步骤一 加载(Loading)

加载阶段的主要任务是通过类的全限定名(1)获取.class文件(2),并且打开文件,读取文件内容到内存中,最后进行数据格式的解析(3)。加载过程由类加载器(ClassLoader)完成,类加载器可以是系统提供的,也可以是用户自定义的。

(1)什么是全限定名?

全限定类名也就是包名+类名。

例如java.lang.String

(2)找的整个过程,也叫做"双亲委派模型"

双亲委派模型是Java类加载的核心机制,采用分层责任链模式:当类加载器收到加载请求时,会先委托父加载器尝试加载,依次从启动类加载器(Bootstrap)、扩展类加载器(Extension)到应用类加载器(Application)逐级向上传递,只有父加载器无法完成时,子加载器才会自行加载。这种设计保证了核心类库的安全性(防止恶意篡改)、避免了类的重复加载,同时实现了类加载的层次化管理。典型例外场景如JDBC驱动加载会通过线程上下文类加载器打破该模型,以实现基础框架调用用户代码的需求。

(3).class文件是二进制的,那么他的格式是怎么样的?又如何进行解析呢?

步骤二 验证(Verification)

验证阶段的主要目的是确保加载的类文件符合Java虚拟机规范,并且不会危害虚拟机的安全。验证过程包括文件格式验证、元数据验证、字节码验证和符号引用验证。如果验证失败,会抛出VerifyError

步骤三 准备(Preparation)

准备阶段为类的静态变量分配内存,并设置默认初始值(此处申请的内存空间,是一个"未初始化""的内存空间,空间上的每个字节都是0(新申请的 内存自动设置为全0 这是JAVA /GO 等语言约定俗成的操作))。这些变量所使用的内存都将在方法区中进行分配。需要注意的是,准备阶段只会为静态变量分配内存并设置默认值,而不会执行任何Java代码。

步骤四 解析(Resolution)

针对代码中的常量进行初始化

.class文件中,也会涉及到一些常量,常量也是需要放到内存中去的,这时候就需要把.class文件的常量加载到内存中去。

步骤五 初始化(Initialization)

初始化阶段是类加载过程的最后一步,主要任务是进入到用户写的代码的环节。此时,类的静态成员,就要执行真正的初始化操作。(包括静态代码块 以及 针对父类/要实现的接口的加载)

例如:

class Test{

class int n = 10;

}

class B extends A

加载B的时候,需要判定A是否已经加载过了。如果A已经加载了,那么不必再加载(一个类加载一次就够了);如果A没有加载,就需要把A也加载了。

相关推荐
麦兜*5 分钟前
【Spring Boot】Spring Boot 4.0 的颠覆性AI特性全景解析,结合智能编码实战案例、底层架构革新及Prompt工程手册
java·人工智能·spring boot·后端·spring·架构
野犬寒鸦13 分钟前
MyBatis-Plus 中使用 Wrapper 自定义 SQL
java·数据库·后端·sql·mybatis
expect7g20 分钟前
Java的DNS缓存问题
java·后端
oioihoii21 分钟前
C++11中的std::minmax与std::minmax_element:原理解析与实战
java·开发语言·c++
karry01301 小时前
高并发导致重复key问题--org.springframework.dao.DuplicateKeyException
java·数据库·ide
全栈凯哥1 小时前
20.缓存问题与解决方案详解教程
java·spring boot·redis·后端·缓存
小莫分享1 小时前
2023年最新总结,阿里,腾讯,百度,美团,头条等技术面试题目,以及答案,专家出题人分析汇总。
java·后端·面试·职场和发展
Brookty1 小时前
【操作系统】线程
java·linux·服务器·后端·学习·java-ee·操作系统
Dovis(誓平步青云)1 小时前
探索飞算 JavaAI 进阶:解锁高效Java开发的新维度
java·开发语言·飞算java
小雪_Snow1 小时前
多态 使用场景
java