Java 类加载机制&双亲委派模型

1.类加载是什么?

将 “.Java” 的类文件 转换成 “.class” 的字节码文件 。

然后JVM负责执行 “.class” 文件。

2.类加载过程?

5 个阶段:载入、验证、准备、解析和初始化

这 5 个阶段一般是顺序发生的,但在动态绑定的情况下,解析阶段发生在初始化阶段之后。

(1)Loading(载入)

JVM 在该阶段的主要目的

是将字节码,从不同的数据源,转化为二进制字节流,加载到内存中,并生成一个代表该类的 java.lang.Class 对象。

(2)Verification(验证

JVM 会在该阶段对二进制字节流进行校验,只有符合 JVM 字节码规范的才能被 JVM 正确执行。该阶段是保证 JVM 安全的重要屏障,

下面是一些主要的检查。

  • 确保二进制字节流格式符合预期(比如说是否以 cafe bene 开头)。
  • 是否所有方法都遵守访问控制关键字的限定。
  • 方法调用的参数个数和类型是否正确。
  • 确保变量在使用之前被正确初始化了。
  • 检查变量是否被赋予恰当类型的值。

(3)Preparation(准备)

JVM 会在该阶段对类的静态变量 分配内存并初始化(对应数据类型的默认初始值,如 0、0L、null、false 等)。

静态变量默认为 0 null 等初始值

静态常量则为 本身定义的值 如 59 王五  等

(4)Resolution(解析)

该阶段将常量池中的符号引用转化为直接引用。

what?符号引用,直接引用?

符号引用以一组符号(任何形式的字面量,只要在使用时能够无歧义的定位到目标即可)来描述所引用的目标。

在编译时,Java 类并不知道所引用的类的实际地址,因此只能使用符号引用来代替。比如 com.Wanger 类引用了 com.Chenmo 类,编译时 Wanger 类并不知道 Chenmo 类的实际内存地址,因此只能使用符号 com.Chenmo

直接引用通过对符号引用进行解析,找到引用的实际内存地址。

(5)Initialization(初始化)

该阶段是类加载过程的最后一步。在准备阶段,类变量已经被赋过默认初始值,而在初始化阶段,类变量将被赋值为代码期望赋的值。

相当于执行类的构造方法。

3.类加载器有哪些?双亲委派模型是什么样子?

双亲委派模型

如果一个类加载器收到了加载类的请求,它会先把请求委托给上层加载器去完成,上层加载器又会委托上上层加载器,一直到最顶层的类加载器;

如果上层加载器无法完成类的加载工作时,当前类加载器才会尝试自己去加载这个类。

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值