jvm 类装载器

jvm 类装载器


class 装载、认证流程

  • 加载
    • 加载类的第一阶段
    • 取得二进制流
    • 转为方法区的数据结构
    • 在Java堆中生成对应的java.lang.Class对象
  • 链接
    • 验证
      • 目的:保证Class流的格式是正确的
        • 文件格式的验证
          • 是否以0xCAFEBABE开头
          • 版本号是否合理
        • 元数据的验证
          • 是否有父类
          • 是否继承了final类
          • 非抽象类实现了所有的抽象方法
        • 字节码的验证(很复杂)
          • 运行检查
          • 栈数据类型的和操作数据参数吻合
          • 跳转指令制定到合理的位置
        • 符号引用验证
          • 常量池中描述类是否存在
          • 访问的方法或字段是否存在且有足够的权限
    • 准备
      • 分配内存,并为类设置初始值(方法区中)
    • 解析
      • 符号引用替换为直接引用
  • 初始化
    • 执行类构造器
      • 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

打破常规模式

热替换

  • 含义
    • 当一个class被替换后,系统无需重启,替换的类立即生效

  • 问题:java.lang.NoSuchFieldException 可能在什么阶段抛出
    1. 本身就没有该Field;
    2. 有该Field,但是该Field是使用private修饰的,而在获取该Field的时候,需要使用getDeclaredField这个方法。

    自己在学习jvm时自己总结的一些知识点,如果哪里不正确,欢迎指正。

猜你喜欢

转载自blog.csdn.net/y534560449/article/details/81335143