【读书会第十二期】 《深入理解Java虚拟机》第4章Java虚拟机类加载机制
虚拟机类加载机制
类加载过程
类加载的时机
• new 关键字,静态相关的变量
• Reflect反射调用时
• 子类调用先初始化父类
• 程序的主类
类加载过程
• 加载
• 验证
• 准备
• 解析
• 初始化
验证
• 文件格式验证
• 元数据验证
• 字节码验证
• 符号引用验证
解析
符号引用(Symbolic References): 符号引用以一组符号来描述所引用的目标,符号可以是符合约定的任何形式的字面量,符号引用与虚拟机实现的内存布局无关,引用的目标并不一定已经加载到内存中。
直接引用(Direct References): 直接引用可以是直接指向目标的指针、相对偏移量或是一个能间接定位到目标的句柄。直接引用与虚拟机实现的内存布局相关,引用的目标必定已经在内存中存在。
类加载机制
双亲委派模型
双亲委派模型要求除了顶层的启动类加载器外,其余的类加载器都应当有自己的父类加载器。这里类加载器之间的父子关系一般不会以继承的关系来实现,而都是使用组合的关系复用父类加载器的代码。
双亲委派模型的工作过程是:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有当父加载器反馈自己无法完成加载请求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去加载。
类加载的时机
• 隐式加载 new 创建类的实例,
• 显式加载:loaderClass,forName等
• 访问类的静态变量,或者为静态变量赋值
• 调用类的静态方法
• 使用反射方式创建某个类或者接口对象的Class对象。
• 初始化某个类的子类
• 直接使用java.exe命令来运行某个主类
- 点赞
- 收藏
- 关注作者
评论(0)