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时自己总结的一些知识点,如果哪里不正确,欢迎指正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值