类加载机制
JVM(Java虚拟机)内存加载流程主要指的是类加载机制,即Java类从磁盘上的.class文件或其他来源被加载到JVM内存中并成为可执行类的过程。以下是JVM类加载的详细步骤:
加载(Loading):
- 当程序首次主动使用某个类时(如调用new操作符创建实例、访问静态成员或调用类的静态方法等),JVM的类加载器子系统开始工作。
- 类加载器根据类的全限定名查找对应的.class文件或其他类定义资源。
- 将找到的.class文件字节流读入内存,并在内存的方法区内存空间内创建一个代表该类的Class对象。
- 在Java 1.8及以后版本中,方法区被称为元空间(MetaSpace),不在堆中而是直接占用本地内存。
链接(Linking):
- 验证(Verification):确保加载的类信息符合JVM的规范,例如格式正确、语义合法等,不会危害JVM的安全性。
- 准备(Preparation):为类的静态变量分配内存,并将其初始化为默认值(对于基本类型是零值,对于对象引用则是null)。
- 解析(Resolution):把类型引用解析为具体的类型、字段和方法的直接引用。这一阶段主要是对常量池中的符号引用进行替换为直接引用的过程,使得后续能够直接访问到方法区内的目标位置。
初始化(Initialization):
- 如果类还未初始化(即
<clinit>方法尚未执行过),那么JVM会触发类初始化过程。 - 执行类变量初始化前的静态初始化块,并按顺序赋予静态变量指定的初始值。
- 注意,只有当父类初始化完成后才会初始化子类。
- 如果类还未初始化(即
类加载的整个流程保证了类在被JVM执行之前是安全且有效的,同时初始化过程确保了类的状态按照程序员的意愿正确设置。类加载结束后,类就可以被JVM执行引擎所使用,创建对象并在内存的不同区域(如堆、栈等)分配空间存储对象的状态和执行方法。
此外,类加载器还遵循双亲委派模型,即当一个类加载请求到来时,先交给父类加载器尝试加载,若父类加载器无法加载时才由当前加载器尝试加载,这样可以保证Java核心API类库的唯一性和安全性。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 From Zero to Hero!