• 【JVM】JVM类加载机制



    JVM的类加载机制,就是把类,从硬盘加载到内存中

    Java程序,最开始是一个Java文件,编译成.class文件,运行Java程序,JVM就会读取.class文件,把文件的内容,放到内存中,并且构造成.class类对象

    加载

    这里的加载是整个类加载的一个阶段,他和类加载是不同的

    在整个类加载的过程中 主要任务就是找到.class文件 打开文件 读取文件内容 ,并且尝试解析格式

    双亲委派模型

    双亲委派模型 描述类加载的过程中 如何找到.class文件

    JVM加载.class文件的时候,需要用到"类加载器"模块,JVM中自带了三个类加载器 Bootstrap ClassLoader,Extension ClassLoader,Application ClassLoader

    此处的三个类加载器有"父子关系",在一个对象内有一个parent引用指父类加载器实例
    在这里插入图片描述
    在这里插入图片描述

    验证

    检查当前.class文件的格式 是否符合要求

    .class文件虽然是二进制文件 但是内部也是有一定结构的

    1. 魔数(magic number) .class文件的开头四个字节是一个固定的魔数,用于标识该文件是否为有效的.class文件

    2. 版本信息 两个字节的版本号 表示编译器的主版本和次版本号,用于确定使用的Java编译器的版本

    3. 常量池(constant pool) 常量池是 .class 文件中最重要的部分之一,它存储了类、接口、字段、方法等元素的符号引用和常量值。常量池是一个表结构,以 1 开始计数,包含了若干个常量池项。

    4. 访问标志 访问标志用于描述类或接口的访问权限和特性,如是否为 public、final、abstract 等。

    5. 类索引 类索引指向常量池中类或接口的描述符;父类索引指向常量池中父类的描述符;接口索引表列出了实现的接口的描述符。

    6. 字段表和方法表 字段表包含了类或接口中定义的所有字段的信息,如名称、类型、修饰符等;方法表包含了类或接口中定义的所有方法的信息,如名称、参数类型、返回类型、修饰符等。

    7. 属性表 属性表包含了类、字段和方法的附加信息,如编译器生成的代码、注解等。属性表是可选的,可以包含零个或多个属性。

    总的来说 一个Java文件里的所有信息 在.class文件中都会有所体现

    准备

    准备阶段是正式为类中定义的变量,即静态变量 分配内存并设置变量初始值

    解析

    Java虚拟机将常量池内的符号引用替换为直接引用的过程,也就是初始化常量的过程

    .class文件中 不知道字符串真实的内存地址是在哪里,只知道一个相对的偏移量 也就是知道字符串的内容在.class文件的哪个地方 等到字符串内容加载到内存之后,就可以把真实 的地址,替换到刚才的符号引用这里了

    初始化

    初始化阶段,Java虚拟机真正开始执行类中编写的Java程序代码 将主导权移交给应用程序,初始化阶段就是执行类构造器方法的过程

    在这里插入图片描述

  • 相关阅读:
    FANUC机器人socket通讯硬件配置
    springnative让java应用脱离jvm
    [附源码]Python计算机毕业设计Django图书馆出版物预订系统
    计算机网络体系结构
    阿里巴巴战略放弃“天猫香港”,专注于改善跨境电子商务
    Linux·知识点常见问题
    防火墙dmz实验
    底层概念的重要意义
    肝了一周的八万字Redis实战篇
    openGauss 社区 2022 年 8 月运作报告
  • 原文地址:https://blog.csdn.net/m0_72670269/article/details/133849895