【读书会第十二期】 《深入理解Java虚拟机》第4章Java虚拟机类加载机制

举报
Archive 发表于 2022/05/09 10:01:07 2022/05/09
【摘要】 虚拟机类加载机制类加载过程类加载的时机• new 关键字,静态相关的变量• Reflect反射调用时• 子类调用先初始化父类• 程序的主类类加载过程• 加载• 验证• 准备• 解析• 初始化验证• 文件格式验证• 元数据验证• 字节码验证• 符号引用验证解析符号引用(Symbolic References): 符号引用以一组符号来描述所引用的目标,符号可以是符合约定的任何形式的字面量,符号引...

虚拟机类加载机制

类加载过程

类加载的时机

new 关键字,静态相关的变量

Reflect反射调用时

子类调用先初始化父类

程序的主类

类加载过程

加载

验证

准备

解析

初始化

验证

文件格式验证

元数据验证

字节码验证

符号引用验证

解析

符号引用(Symbolic References): 符号引用以一组符号来描述所引用的目标,符号可以是符合约定的任何形式的字面量,符号引用与虚拟机实现的内存布局无关,引用的目标并不一定已经加载到内存中。

直接引用(Direct References): 直接引用可以是直接指向目标的指针、相对偏移量或是一个能间接定位到目标的句柄。直接引用与虚拟机实现的内存布局相关,引用的目标必定已经在内存中存在。

类加载机制

双亲委派模型

双亲委派模型要求除了顶层的启动类加载器外,其余的类加载器都应当有自己的父类加载器。这里类加载器之间的父子关系一般不会以继承的关系来实现,而都是使用组合的关系复用父类加载器的代码。

双亲委派模型的工作过程是:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有当父加载器反馈自己无法完成加载请求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去加载。

类加载的时机

隐式加载 new 创建类的实例,

显式加载:loaderClass,forName等

访问类的静态变量,或者为静态变量赋值

调用类的静态方法

使用反射方式创建某个类或者接口对象的Class对象。

初始化某个类的子类

直接使用java.exe命令来运行某个主类

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。