Java 类加载机制 简结

本文详细阐述了Java类加载过程,包括加载、链接和初始化三个阶段。深入解析了链接过程中的验证、准备和解析步骤,以及初始化阶段如何给静态变量赋值。同时,介绍了类加载机制中的全盘负责、双亲委派和缓存机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、类加载过程: 加载(loading) -> 链接(linking) -> 初始化(initialization)

其中链接又分为三个小部分:验证(verification) -> 准备(preparation) -> 解析(resolution)

Ⅰ  加载(loading)

将class文件读入内存,并为之创建一个java.lang.Class对象。这一步由类加载器完成,一般由JVM提供,也可以继承ClassLoader实现自己的类加载器。需要注意的是,并不是所有的类都是在使用时才加载,JVM允许某些类预先加载。

Ⅱ 链接(linking)

将二进制类数据合并到JRE(Java Runtime Environment)中。

1. 验证(verification) 验证加载的类是否有正确的内部结构。作用:防止危害虚拟机的安全。主要包括:

    - [文件格式验证] 是否符合class文件规范。

    - [元数据验证] 分析字节码语义,是否符合java语言规范 。

    - [字节码验证] 分析数据流和控制,是否合乎逻辑 。

    - [符号引用验证] 确保一定能被引用到(符号引用转化为直接引用时 概念参考)。此过程延续到解析阶段。

2. 准备(preparation) 为静态变量分配内存,设置默认值

private static int number = 0;

3. 解析(resolution)  现在已经为静态变量分配了内存,那么就需要将这些变量的符号引用替换为直接引用,这就是链接。

Ⅲ 初始化(initialization)

一切准备就绪,现在可以给静态变量赋予正确的初始值。

private static int number = 10;

二、类加载机制

- 全盘负责  类加载器加载某个类时,也同时负责该类引用的其他类的加载,除非有显示的指定类加载器。

- 双亲委派  优先让父类加载class【递归执行】,若父类无法加载再交由子类加载。这种机制可避免子类与父类重复加载。

- 缓存机制  加载过的class将被缓存,不会再次加载。这就导致很多时候修改了代码需要重启jvm。

 

问题:什么条件下修改了代码或者修改了哪些代码不需要jvm重启?

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值