Java虚拟机(JVM)
类加载
Java类加载的过程可以分为以下几个步骤:
- 加载(Loading):类加载的第一步是将类的字节码文件加载到内存中。
- 通过类的全名,全限定名(包括包名和类名)查找并读取字节码文件
- 解析类的二进制数据流为方法区内的数据结构(Java 类模型)
- 创建 java.lang.Class 类的实例,表示该类型。作为方法区这个类的各种数据的访问入口
类模板对象,其实就是 Java 类在 JVM 内存中的一个快照,JVM 将从字节码文件中解析出的常量池、类字段、类方法等信息存储到模板中,这样 JVM 在运行期便能通过类模板而获取 Java 类中的任意信息,能够对 Java 类的成员变量进行遍历,也能进行 Java 方法的调用。
-
验证(Verification):在验证阶段,JVM会对加载的字节码文件进行验证,确保其符合Java语言规范和安全要求。验证过程包括检查字节码的结构、语义和安全性,以防止恶意代码或错误的字节码被加载。
-
准备(Preparation):在准备阶段,JVM会为类的静态变量分配内存,并设置默认初始值。这些静态变量包括静态字段和静态常量。
-
解析(Resolution):在解析阶段,JVM会将符号引用转换为直接引用。符号引用是一种符号化的引用,它包含类、方法、字段等的符号名称。解析过程将符号引用解析为具体的内存地址,以便在运行时能够正确访问类、方法或字段。
-
初始化(Initialization):在初始化阶段,JVM会执行类的初始化代码,包括静态变量的赋值和静态代码块的执行。类的初始化是在首次使用该类时进行的,它确保类的静态资源被正确初始化,并且只会执行一次。
-
使用(Usage):在类加载完成后,类就可以被使用了。可以通过创建对象、调用方法等方式使用类。
需要注意的是,Java类加载是按需加载的,即只有在需要使用某个类时才会进行加载。此外,JVM还提供了类加载器(ClassLoader)机制,允许自定义类加载器来实现特定的加载策略和动态加载类。