本文从以下方法介绍类加载过程:
一、类加载时机
二、类加载过程
一、类加载时机
类从加载到虚拟机内存开始,到从虚拟机内存卸载出为止,生命周期如下:
加载(Loading)
验证(Verification)
准备(Preparation)
解析(Resolution)
初始化(Initialization)
使用(Using)
卸载(Unloading)
注意:加载,验证,准备,初始化,卸载,5个阶段的顺序是确定的。
验证、准备、解析阶段也称为连接阶段。
解析阶段的顺序不一定,可能会在初始化阶段之后,这是为了支持java语言的动态绑定。
1、加载
对于类加载过程中的第一个阶段:加载,虚拟机规范中没有明确的规定强制约束加载时机,而是有虚拟机具体实现自由把握。
2、初始化
虚拟机规范明确规定有且只有4中情况立即对类进行初始化(而加载、验证、准备还是要在初始化之前执行)
(1)遇到new、getstatic、putstatic、invokestatic这4条字节码指令时,如果类未初始化,则立即进行初始化。
(2)使用java.lang.reflact包中的方法对类进行反射调用的时候,如果类未进行初始化,则需要先出发其初始化。
(3)如果初始化一个类时,如果其父类还未进行初始化,则先初始化其父类。
(4)当虚拟机启动时,用户指定一个执行的主类(包含main()方法的类),虚拟机会先初始化该类。
二、类加载过程
类加载的全过程包括加载、验证、准备、解析、初始化五个阶段。
1、加载
“类加载”过程的第一个阶段为“加载”。
加载过程虚拟机执行的操作:
(1)通过类的全限定名(包名+类名)来获取此类的二进制字节类。
(2)将该字节流所代表的静态存储结构转为方法区运行时数据结构。
(3)在堆中生成一个java.lang.Class的字节码文件对象,作为访问方法区数据的入口。
2、验证
为连接阶段的第一步,该步骤的目的是为了确保class文件中包含的信息符合当前虚拟机的要求。
(1)文件格式的验证:
验证字节流是否符合class文件的格式规范,并且能否被当前版本的虚拟机处理。
该阶段的验证部分包括:
①魔数;
②次版本;
③主版本;
④常量池中的常量是否有不被支持的常量类型;
(2)元数据的验证:
对字节码的描述信息进行语义分析,确保描述信息符合java语言的规范要求。
该阶段验证部分如下:
①该类是否有父类,(除了java.lang.Object之外);
②如果有继承关系,父类是否被final修饰;
③如果类不是抽象类或接口,是否实现其父类或接口中的所有方法;
④类中的字段、方法是否与父类产生冲突,如:重写父类中的final方法;
(3)字节码验证
进行数据流和流分析;对类中的方法进行校验和分析。
①保证任意时刻操作数栈中的数据类型与指令码序列都能配合工作;
②保证跳转的指令不会跳转到方法体以外的字节码指令上;
(4)符合引用的验证
校验虚拟机将符号引用转为直接引用的时候信息正确性,该动作在解析阶段发生。
校验内容如下:
①符号引用对应的字符串所表示的全限定名是否能够找到对应的类;
②符号引用中的类、字段、方法的访问性(private...)是否可被当前类访问;
3、准备
准备阶段正式为类变量(static变量)赋初始值,这些内存在方法区中分配。此阶段并未进行类变量的显示初始化赋值。
如:private static int i =123; 该阶段初始值为0而不是123。
特殊情况:
private static int i =123;
javac将i的值生成ConstantValue属性,则再准备阶段虚拟机会根据ConstantValue的设置将i赋值为123。
4、解析
解析阶段虚拟机将常量池中的符号引用直接替换为直接引用的过程。
符号引用:符号引用通过一组符号来描述目标,符号引用可以是任何形式的字面量。符号引用与虚拟机 的内存分布无关,引用的目标不一定需要加载到内存。
直接引用:直接指向目标的指针,相对偏移量或一个能够间接定位目标的句柄。直接引用虚拟机的内存 布局有关,如果有直接引用,则表示目标一定在内存中。
①类或接口的解析
②字段的解析
③类方法的解析
④接口方法的解析
5、初始化
类加载过程中的最后一个阶段,准备阶段已经为类变量进行默认初始化赋值,则该阶段为类变量进行显示初始化赋值。
初始化的阶段是执行类构造器<client>的过程。
本文参考自 《深入理解Java虚拟机》 周志明
相关推荐
Java 类加载过程是Java程序运行时的关键环节,它涉及到如何将类的字节码加载到JVM中并准备执行。整个过程可以分为五个主要步骤:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)和...
下面我们将详细探讨WebLogic的类加载过程。 1. **类加载器层次结构** WebLogic的类加载器体系遵循“父类加载器优先”原则,这意味着当一个类加载请求发生时,首先由父类加载器尝试加载,只有在其无法找到相应类时...
JVM类加载过程 JVM(Java Virtual Machine)是Java语言的核心组件之一,它是Java语言的可移植性和跨平台性的基础。JVM主要组成部分包括类加载子系统、执行引擎、本地方法接口和运行时数据区。 类加载子系统是JVM的...
SpringBoot 类加载过程详解 在深入探讨Spring Boot的类加载过程之前,让我们先理解一下类加载的基本概念。Java中的类加载是由JVM(Java虚拟机)执行的,它负责将类的字节码加载到内存中,进行校验、解析,并准备类...
Java 类加载过程是Java虚拟机(JVM)在运行时动态加载类的机制,它涉及类的生命周期中的几个关键步骤,包括装载、连接、初始化和卸载。下面将详细阐述这些过程。 1. 装载 装载阶段是类加载的起始点,主要分为三个...
类加载器在类加载过程中扮演重要角色,它负责找到类的字节流并将其转换为运行时可用的形式。系统提供了几个内置类加载器,如Bootstrap ClassLoader(引导类加载器)、Extension ClassLoader(扩展类加载器)和...
Java虚拟机(JVM)的类加载过程是Java程序运行的基础,它涉及到类加载器、类的生命周期和一系列复杂的步骤。在这个过程中,类加载器主要任务是根据类的全限定名加载二进制字节流并转化为`java.lang.Class`对象。整个...
类加载过程包括三个主要阶段:加载、验证、准备、解析和初始化。 1. 加载:类加载器读取类的二进制数据,这些数据通常来自.class文件,也可能来自网络、数据库或其他数据源。 2. 验证:确保加载的类数据符合Java...
#### 二、类加载过程 类加载过程主要包括三个步骤: 1. **加载**:通过类的全限定名找到该类的二进制字节流。 2. **连接**: - **验证**:确保加载的类文件符合JVM规范,包括字节流文件的格式正确性、元数据的...
类加载过程涉及到类的加载、链接(验证、准备、解析)、初始化等阶段,并且这一过程是由类加载器系统完成的。 #### 二、类加载器系统 Java中的类加载器系统主要包括以下几种类型的类加载器: 1. **Bootstrap ...
- 类加载过程分为三个阶段:加载、验证、准备、解析和初始化。在加载阶段,类加载器寻找并加载类的二进制数据。 - Java中的类加载器采用双亲委派模型,即一个类首先由启动类加载器Bootstrap ClassLoader尝试加载,...
类加载工具则是辅助开发者理解和分析类加载过程的实用程序。这些工具可以帮助我们定位类的来源,查看加载顺序,以及优化应用的性能。 标题中的“类加载的工具”可能指的是用于监控和分析类加载过程的各种工具。在...
Java 类加载器原理 Java 类加载器是Java虚拟机...类加载器的机制保证了Java的类加载过程是有序且安全的,同时也支持了Java的动态加载和模块化特性。在自定义类加载器时,需要遵循这些规则,以便正确地扩展JVM的功能。
#### 五、类加载过程详解 类加载的过程主要分为三个阶段:加载(Loading)、连接(Linking)和初始化(Initialization)。 1. **加载**(Loading): - 类加载器查找并加载类的二进制流。 - 创建`java.lang....
当遇到`java.lang.ClassNotFoundException`异常时,通常是因为类加载过程出现了问题。了解类加载机制对于解决这类问题至关重要,同时也有助于深入理解Java虚拟机(JVM)的工作原理。 Java 类加载机制主要由类加载器...
类加载过程中可能会遇到一些问题,如类冲突、类循环依赖等。类冲突通常发生在不同加载器加载了相同包名下的类,导致版本不一致。类循环依赖则可能引发无限递归,使得类加载失败。解决这些问题通常需要对类加载器的...
类加载过程包括加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)和初始化(Initialization)五个阶段。其中,初始化阶段会执行类的静态代码块,这是`Class.forName()`方法中`...