【JVM】JVM类加载机制

JVM类加载机制

  • 加载
    • 双亲委派模型
  • 验证
  • 准备
  • 解析
  • 初始化

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

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

加载

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

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

双亲委派模型

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

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

此处的三个类加载器有"父子关系",在一个对象内有一个parent引用指父类加载器实例
【JVM】JVM类加载机制_第1张图片
【JVM】JVM类加载机制_第2张图片

验证

检查当前.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程序代码 将主导权移交给应用程序,初始化阶段就是执行类构造器方法的过程

【JVM】JVM类加载机制_第3张图片

你可能感兴趣的:(JVM,Java,jvm,java)