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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值