JVM类加载机制
- 加载
- 双亲委派模型
- 验证
- 准备
- 解析
- 初始化
JVM的类加载机制,就是把类,从硬盘加载到内存中
Java程序,最开始是一个Java文件,编译成.class文件,运行Java程序,JVM就会读取.class文件,把文件的内容,放到内存中,并且构造成.class类对象
加载
这里的加载是整个类加载的一个阶段,他和类加载是不同的
在整个类加载的过程中 主要任务就是找到.class文件 打开文件 读取文件内容 ,并且尝试解析格式
双亲委派模型
双亲委派模型 描述类加载的过程中 如何找到.class文件
JVM加载.class文件的时候,需要用到"类加载器"模块,JVM中自带了三个类加载器 Bootstrap ClassLoader,Extension ClassLoader,Application ClassLoader
此处的三个类加载器有"父子关系",在一个对象内有一个parent引用指父类加载器实例
验证
检查当前.class文件的格式 是否符合要求
.class文件虽然是二进制文件 但是内部也是有一定结构的
-
魔数(magic number) .class文件的开头四个字节是一个固定的魔数,用于标识该文件是否为有效的.class文件
-
版本信息 两个字节的版本号 表示编译器的主版本和次版本号,用于确定使用的Java编译器的版本
-
常量池(constant pool) 常量池是 .class 文件中最重要的部分之一,它存储了类、接口、字段、方法等元素的符号引用和常量值。常量池是一个表结构,以 1 开始计数,包含了若干个常量池项。
-
访问标志 访问标志用于描述类或接口的访问权限和特性,如是否为 public、final、abstract 等。
-
类索引 类索引指向常量池中类或接口的描述符;父类索引指向常量池中父类的描述符;接口索引表列出了实现的接口的描述符。
-
字段表和方法表 字段表包含了类或接口中定义的所有字段的信息,如名称、类型、修饰符等;方法表包含了类或接口中定义的所有方法的信息,如名称、参数类型、返回类型、修饰符等。
-
属性表 属性表包含了类、字段和方法的附加信息,如编译器生成的代码、注解等。属性表是可选的,可以包含零个或多个属性。
总的来说 一个Java文件里的所有信息 在.class文件中都会有所体现
准备
准备阶段是正式为类中定义的变量,即静态变量 分配内存并设置变量初始值
解析
Java虚拟机将常量池内的符号引用替换为直接引用的过程,也就是初始化常量的过程
.class文件中 不知道字符串真实的内存地址是在哪里,只知道一个相对的偏移量 也就是知道字符串的内容在.class文件的哪个地方 等到字符串内容加载到内存之后,就可以把真实 的地址,替换到刚才的符号引用这里了
初始化
初始化阶段,Java虚拟机真正开始执行类中编写的Java程序代码 将主导权移交给应用程序,初始化阶段就是执行类构造器方法的过程