【jvm】类加载分几步
目录
-
-
-
-
- [1. 加载(Loading)](#1. 加载(Loading))
- [2. 链接(Linking)](#2. 链接(Linking))
-
- [2.1 验证(Verification)](#2.1 验证(Verification))
- [2.2 准备(Preparation)](#2.2 准备(Preparation))
- [2.3 解析(Resolution)](#2.3 解析(Resolution))
- [3. 初始化(Initialization)](#3. 初始化(Initialization))
- [4. 使用(Using)](#4. 使用(Using))
- [5. 卸载(Unloading)](#5. 卸载(Unloading))
1. 加载(Loading)
- 1.加载是类加载过程的第一个阶段,由类加载器(ClassLoader)负责执行。
- 2.通过类的全限定名获取定义此类的二进制字节流:这通常意味着从文件系统、网络或其他来源读取类的.class文件或其他格式的二进制表示。
- 3.将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构 :在Java虚拟机(JVM)中,方法区用于存储已被虚拟机加载的类信息 、常量 、静态变量 、即时编译器编译后的代码等数据。
- 4.在内存中生成一个代表这个类的java.lang.Class对象:这个对象作为方法区这个类的各种数据的访问入口,是程序在运行时访问类的元数据的主要方式。
-
- 这些步骤在逻辑上是按顺序进行的,但在实际执行过程中,某些步骤(如解析)可能会与初始化阶段交叉进行,以支持Java语言的动态绑定特性。
2. 链接(Linking)
- 1.链接过程可以细分为验证 (Verification)、准备 (Preparation)和解析(Resolution)三个阶段。
2.1 验证(Verification)
- 1.目的:确保加载的类文件信息符合JVM规范,不会危害虚拟机自身的安全。
- 2.内容:包括文件格式 验证、元数据 验证、字节码 验证和符号引用验证。这些验证确保了类文件的合法性、合理性和一致性。
2.2 准备(Preparation)
- 1.任务:为类的静态变量(被static修饰的变量)分配内存 并设置初始值 。这些初始值通常是数据类型默认的零值 (如int为0,boolean为false等),而不是被显式赋的值。需要注意的是,如果static变量是final的,并且其基本类型或String类型的值在编译时就已经确定,那么这些值在准备阶段就会被赋上。
2.3 解析(Resolution)
- 1.过程:将常量池内的符号引用替换为直接引用的过程。符号引用以一组符号来描述所引用的目标,而直接引用则是直接指向目标的指针、相对偏移量或者一个能间接定位到目标的句柄。
3. 初始化(Initialization)
- 1.初始化阶段是类加载过程的最后一步,主要完成类的静态变量的初始化工作。
- 2.静态变量的初始化是由类构造器()方法完成的,这个方法由编译器自动收集类中的所有类变量的赋值动作和静态语句块(static{}块)中的语句合并产生的。
- 3.初始化阶段只会在类被主动使用时才会触发,如创建类的实例、访问某个类或接口的静态变量、调用类的静态方法等。
4. 使用(Using)
- 1.使用阶段是指类被加载、链接和初始化后,通过Java程序中的new关键字创建类的实例 ,或者通过反射等方式调用类的静态方法、访问静态变量等操作。
- 2.在这个阶段,类的功能被充分利用,程序执行了类定义中的代码。
5. 卸载(Unloading)
- 1.卸载是类生命周期的最后一个阶段,也是JVM垃圾回收机制的一部分。
- 2.当类不再被JVM中的任何对象所引用,即类的所有实例都已被回收,并且加载该类的ClassLoader也已经被回收时,该类就可能被卸载。
- 3.卸载过程包括释放类在方法区占用的内存空间,以及相关的其他资源。
- 4.需要注意的是,类卸载并不是强制的,而是由JVM的垃圾回收器来决定的。