深入Java虚拟机JVM类加载初始化学习笔记("Java虚拟机JVM类加载与初始化深度学习笔记")
原创
一、JVM类加载概述
Java虚拟机(JVM)是Java程序运行的基础平台,它负责将Java字节码文件(.class)加载到内存中,并为Java程序提供运行时环境。类加载是JVM的一个重要组成部分,它负责将Java类库中的类加载到内存中,并为程序提供类的定义。本文将深入探讨JVM类加载与初始化的过程。
二、类加载器
类加载器(ClassLoader)是JVM用于加载类的组件,它负责将类的字节码文件读取到内存中,并创建对应的Class对象。JVM内置了三种类加载器:Bootstrap ClassLoader、Extension ClassLoader和System ClassLoader。
2.1 Bootstrap ClassLoader
Bootstrap ClassLoader是JVM的根类加载器,负责加载JVM核心库(rt.jar)中的类。它是用原生代码(如C/C++)实现的,不是Java类,故而我们无法直接访问它。
2.2 Extension ClassLoader
Extension ClassLoader负责加载JVM扩展库(jre/lib/ext目录下)中的类。它是由Bootstrap ClassLoader加载的,并继承自ClassLoader类。
2.3 System ClassLoader
System ClassLoader是JVM默认的类加载器,负责加载应用程序类路径(ClassPath)中的类。它是由Extension ClassLoader加载的,并继承自ClassLoader类。
三、类加载过程
类加载过程分为五个阶段:加载、验证、准备、解析和初始化。下面我们逐一介绍这五个阶段。
3.1 加载(Loading)
加载阶段是类加载过程的第一步,它负责将类的字节码文件(.class)读取到内存中,并创建对应的Class对象。加载阶段的核心步骤如下:
1. 通过类的全限定名获取类的二进制字节流。
2. 将字节流成为方法区数据结构。
3. 创建Class对象,并将其放入方法区的类对象池。
3.2 验证(Verification)
验证阶段是类加载过程的第二步,它负责验证字节码文件是否符合JVM规范。验证阶段的核心任务包括:
1. 验证字节码文件格式。
2. 验证字节码文件中的符号引用。
3. 验证字节码文件中的类、字段、方法等是否满足JVM规范。
3.3 准备(Preparation)
准备阶段是类加载过程的第三步,它负责为类中的静态字段分配内存,并设置默认初始值。准备阶段不会执行代码,也不会为实例字段分配内存。
3.4 解析(Resolution)
解析阶段是类加载过程的第四步,它负责将类、接口、字段和方法的符号引用成为直接引用。符号引用是在类加载的第二个阶段(验证阶段)产生的,它指向类、接口、字段和方法的符号名称。直接引用是指向方法区的指针、偏移量或者是指向对象的引用。
3.5 初始化(Initialization)
初始化阶段是类加载过程的最后一步,它负责执行类构造器
public class MyClass {
static {
System.out.println("静态代码块");
}
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
在上面的例子中,当运行main方法时,会先触发MyClass的初始化,然后执行静态代码块中的语句。
四、类加载机制
JVM类加载机制包括三种:懒加载(Lazy Loading)、预加载(Preloading)和重复加载(Reloading)。
4.1 懒加载
懒加载是指类在第一次使用时才进行加载。这种方案可以降低类加载的开销,减成本时间程序的启动速度。
4.2 预加载
预加载是指类在程序启动时预先加载。这种方案可以降低运行时的类加载开销,但或许会增多程序的启动时间。
4.3 重复加载
重复加载是指类在卸载后可以重新加载。这种方案核心用于动态替换类。
五、类加载优化
类加载优化是减成本时间Java程序性能的重要手段。以下是一些常见的类加载优化策略:
5.1 类加载器优化
使用自定义类加载器,可以按需加载类,降低不必要的类加载开销。
5.2 类路径优化
合理配置类路径,避免重复加载类,降低类加载时间。
5.3 类卸载优化
及时卸载不再使用的类,释放内存,减成本时间程序性能。
六、总结
本文详细介绍了Java虚拟机JVM类加载与初始化的过程,包括类加载器、类加载过程、类加载机制以及类加载优化策略。深入懂得JVM类加载与初始化机制,对于减成本时间Java程序性能、优化程序设计具有重要意义。