2.1虚拟机类加载机制

2.1虚拟机类加载机制

1.类加载机制

(1)类的生命周期

加载->连接(验证,准备,解析)->初始化->使用->卸载

image-20220315111835784

⭐注意事项:有些类的解析会在初始化之后

(2)什么时候加载类

  1. 遇到new,putstatic,setstatic,invokestatic这四条字节码指令时
  2. 反射
  3. 子类加载时会先去加载父类
  4. 主启动类(main函数)会先去加载

⭐注意事项:只有主动引用才会触发类的初始化。被动引用不会触发(但会触发类加载),以下是被动引用的情况

  1. 子类调用父类的staic,父类会加载而子类不会

  2. 对象数组的创建

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-auRvEJvk-1686638190410)(C:\Users\10059\AppData\Roaming\Typora\typora-user-images\image-20220315143447699.png)]

  3. 使用final常量(因为final常量是在编译时就确定好了放在常量池里)

2.类加载机制的过程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QL05ubiA-1686638190411)(C:\Users\10059\AppData\Roaming\Typora\typora-user-images\image-20220315163542744.png)]

(1)加载

一个类只会被加载一次。加载不等于“类加载机制”,只是其中一个过程。当一个类开始加载时,会做以下三件事情

  1. 根据class字节码文件中常量池的类全限定名,获取这个类的二进制字节流
  2. 将这个二进制字节流中的静态存储结构转换为运行中数据结构存放到方法区(类型信息)
  3. 在堆内存中创建这个类的java.lang.Class对象,作为方法区中这个类的各种数据访问入口

(2)验证

验证class字节码文件是否符合标准,例如开头是CAFEBABE

(3)准备

初始化类变量(static修饰的变量)。分为以下两种情况。成员变量的初始化在对象调用方法后才发生

  1. static val:初始化零值

    image-20220315171019664
  2. static final val:直接赋值

(4)解析

将符号引用转换为直接引用放入方法区的运行时常量池。

(5)初始化

调用方法,执行static域(代码块+变量赋值),只调用一次(因为一个类只加载一次)

3.类加载器

(1)类与类加载器

一个类的唯一性是由它本身和类加载器决定的。两者决定了类是否“相等”,即Class对象的equals()、isAssignableFrom(),isInstance()方法的返回结果,以及instanceof方法的返回结果。

instanceof:判断一个对象是否属于某一个类的实例

(2)双亲委派模型

①模型图:
image-20220321165654243
  1. 启动类加载器(Bootstrap ClassLoader):虚拟机自带的类加载器,加载<JAVA_HOME>\lib下的类库

  2. 扩展类加载器(Extension ClassLoader):java实现的类加载器,加载<JAVA_HOME>\lib\ext下的类库

  3. 应用(系统)类加载器(Application ClassLoader):java实现的类加载器,加载classpath下的类库

    image-20220321170117811
  4. 自定义类加载器

②双亲委派机制:

一个类加载器接收到了一个类的加载请求时,它不会尝试加载这个类而是向上委派父加载器去加载,如果父类加载器没法加载才会自己加载。每一个层次的加载器都是这样,这也是为什么一个类要加载会先去加载它的父类。因此所有类加载请求都会先传递到顶层启动类加载器询问它是否能加载。

源码:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-83uFJDQw-1686638190412)(C:\Users\10059\AppData\Roaming\Typora\typora-user-images\image-20220321190306773.png)]

先去加载它的父类。因此所有类加载请求都会先传递到顶层启动类加载器询问它是否能加载。

源码:

[外链图片转存中…(img-83uFJDQw-1686638190412)]

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值