jvm 类装载器
class 装载、认证流程
- 加载
- 加载类的第一阶段
- 取得二进制流
- 转为方法区的数据结构
- 在Java堆中生成对应的java.lang.Class对象
- 链接
- 验证
- 目的:保证Class流的格式是正确的
- 文件格式的验证
- 是否以0xCAFEBABE开头
- 版本号是否合理
- 元数据的验证
- 是否有父类
- 是否继承了final类
- 非抽象类实现了所有的抽象方法
- 字节码的验证(很复杂)
- 运行检查
- 栈数据类型的和操作数据参数吻合
- 跳转指令制定到合理的位置
- 符号引用验证
- 常量池中描述类是否存在
- 访问的方法或字段是否存在且有足够的权限
- 文件格式的验证
- 目的:保证Class流的格式是正确的
- 准备
- 分配内存,并为类设置初始值(方法区中)
- 解析
- 符号引用替换为直接引用
- 验证
- 初始化
- 执行类构造器
- static变量赋值语句
- static{}语句
- 子类的调用前保证父类的先被调用
- 是线程安全的
- 执行类构造器
什么是类装载器 ClassLoader
- ClassLoader是一个抽象类
- ClassLoader实例将读入java字节码将类装载到jvm中
- ClassLoader可以定制,满足不同字节码流获取方式
- ClassLoader负责类装载过程中的 加载阶段
JDK中ClassLoader默认的设计模式
- ClassLoader分类
- Bootstrap ClassLoader 启动ClassLoader
- Extension ClassLoader 扩展ClassLoader
- App ClassLoader 系统/应用ClassLoader
- Custom ClassLoader 自定义ClassLoader
- 协同工作
- 查看已经加载的ClassLoader(自下而上)
- Custom ClassLoader -》 App ClassLoader -》 Extension ClassLoader -》 Bootstrap ClassLoader
- 尝试加载ClassLoader(自上而下)
- Custom ClassLoader -《 App ClassLoader 《- Extension ClassLoader 《- Bootstrap ClassLoader
- 查看已经加载的ClassLoader(自下而上)
打破常规模式
热替换
- 含义
- 当一个class被替换后,系统无需重启,替换的类立即生效
- 问题:java.lang.NoSuchFieldException 可能在什么阶段抛出
- 本身就没有该Field;
- 有该Field,但是该Field是使用private修饰的,而在获取该Field的时候,需要使用getDeclaredField这个方法。
自己在学习jvm时自己总结的一些知识点,如果哪里不正确,欢迎指正。