【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也加载了。

相关推荐
.柒宇.8 分钟前
力扣hot100----15.三数之和(java版)
java·数据结构·算法·leetcode
程序员卷卷狗35 分钟前
JVM 调优实战:从线上问题复盘到精细化内存治理
java·开发语言·jvm
cj6341181501 小时前
【MySQL】mysqldump使用方法
java·后端
JIngJaneIL1 小时前
停车场管理|停车预约管理|基于Springboot的停车场管理系统设计与实现(源码+数据库+文档)
java·数据库·spring boot·后端·论文·毕设·停车场管理系统
杰克尼2 小时前
二分查找为什么总是写错
java·数据结构·算法
半旧夜夏3 小时前
【分布式缓存】Redis持久化和集群部署攻略
java·运维·redis·分布式·缓存
短视频矩阵源码定制3 小时前
矩阵系统源码推荐:技术架构与功能完备性深度解析
java·人工智能·矩阵·架构
Eiceblue4 小时前
使用 Java 将 Excel 工作表转换为 CSV 格式
java·intellij-idea·excel·myeclipse
漂流幻境4 小时前
IntelliJ IDEA的Terminal中执行ping命令时遇到的“No route to host“问题
java·ide·intellij-idea
苹果醋34 小时前
element-ui源码阅读-样式
java·运维·spring boot·mysql·nginx