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

相关推荐
Lhappy嘻嘻2 小时前
Java IO|File 文件操作 + 字节流 / 字符流完整笔记 + 递归删除文件实战
java·笔记·php
伊玛目的门徒3 小时前
试用leetcode之典中典 二数之和问题
java·算法·leetcode
懒鸟一枚5 小时前
深入理解 Linux 内存、Swap 交换分区与分页机制的关系
java·linux·数据库
我命由我123457 小时前
执行 Gradle 指令报错,无法将“grep”项识别为 cmdlet、函数、脚本文件或可运行程序的名称
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
考虑考虑7 小时前
Sentinel安装
java·后端·微服务
凤凰院凶涛QAQ9 小时前
《Java版数据结构 & 集合类剖析》栈与队列:“push/pop 是栈的灵魂,offer/poll 是队列的骨架——四组 API,两种人生”
java·开发语言·数据结构
掘金_答案9 小时前
上线那天,一个 ConcurrentHashMap 差点送走我的 AI 客服——3 天排查 JVM 血泪史
java·后端·架构
猿与禅10 小时前
CosId 分布式 ID 生成器完全教程:从架构原理到生产落地
java·shardingsphere·雪花算法·分布式id·高性能·cosid·号段模式
MindUp10 小时前
企业网盘权限模型解析:多层级访问控制与审计能力选型指南
java·linux·运维
NG47710 小时前
【软件设计与体系结构】-策略设计模式
java·设计模式·软件工程