栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JVM之类加载过程

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JVM之类加载过程

类加载过程

类加载过程分为以下三个过程 加载 -> 链接 -> 初始化,而链接又可以分为三个过程 验证 -> 准备 -> 解析。
整个类加载过程入下图

类的整个生命周期在此基础上又加了两个过程 使用 -> 卸载。

  • 加载
    查找并加载类的二进制数据。

  • 链接

    • 验证
      确保类的信息都是正确的,符合当前使用虚拟机的规范。
      • 文件格式验证:验证字节流是否符合Class文件的格式规范,且能被当前虚拟机处理
      • 源数据验证:对字节码描述的信息进行语义分析,以保证其描述的信息符合Java语言规范。。
      • 字节码验证:通过数据流和控制流分析,确定程序语义是合法的符合逻辑的。
      • 符号引用验证:对类自身以外的信息进行匹配性校验。
    • 准备
      为类的静态变量分配空间(方法区)并初始化为默认值。
      需要注意一下几点
      • 对于基本类型来说,类变量和全局变量如果不显式的对其赋值而直接使用,系统则为其赋值为默认的零值;对于局部变量在使用之前必须显式的为其赋值,否则编译不通过。
      • 对于同时被final和static修饰的常量,必须在声明的时候就为其显式的赋值,否则编译不通过;而只被final修饰的常量既可以在声明是显式的赋值,也可以在类初始化时显示的复制,总之在使用之前必须显式的复制。
      • 对于引用类型,如果没有对其显示的赋值而直接使用,系统会为其赋值为默认的零值。
      • 对于数组在初始化时没有对数组中的各个元素复制,那么系统会根据数据对应的元素类型赋值默认的零值
    • 解析
      将符号引用转为直接引用(地址引用)的过程。直接引用就是直接指向目标的指针、相对偏移量或者一个间接定位到目标的句柄。解析主要针对类或接口、子弹、类方法、接口方法、方法类型、方法句柄和调用点限定符这七类符号引用进行。
  • 初始化
    JVM对类初始化,为类的静态变量赋正确值初始值。对类变量进行初始值设置有两种方式:

    • 声明类变量时指定初始值;
    • 使用静态代码块为类变量指定初始值。

    类初始化时机
    只用当类主动使用的时候才会导致类的初始化。主动是要包含一下6种:

    • 创建类的示例,new;
    • 访问某个类或接口的静态变量,或者对静态变量赋值;
    • 调用类的静态方法;
    • 反射;
    • 初始化某个类的子类;
    • Java虚拟机启动是被表名为启动类的类,直接使用java.exe命令来运行某个类。

如果大家觉得对于类的整个生命周期不方便我们记忆,我们把它想象成购物买手机的过程就很好记忆了。

故事是这样的…
张三存了好久的钱想买一个手机,于是他在网上买了一个IPhone13 Pro Max 1TB 远峰蓝手机,下单就是(加载);怀着激动心情等了几天终于收到新手机(链接);收到手机后我们肯定不能直接使用,还有一些使用前的流程,看看手机屏幕有没有刮痕,电池有没有鼓包等等(验证);如果没有问题,我们贴膜,把手机卡从旧手机中拿出来,放到新手机中等等(准备);然后开机,开机过程中会解析我们的手机卡是移动、联调亦或者电信(解析);正常开启后我们就需要对手机进行数据同步呀等等(初始化);等都操作完我们就可以开心的用新手机了(使用);过了些许时间,张三又买了其他的手机,于是就把这个手机给卖了(卸载),至此该手机的使命就完成。

于是整个流程就是

  • 下单(加载
  • 收货(链接
    • 验货(验证
    • 使用前准备( 准备
    • 插卡开机(解析
  • 使用(使用
  • 换手机(卸载
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/324638.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号