Java类加载过程详解

article/2025/10/12 5:32:40

类的生命周期

  • 类的加载
  • 类加载过程
    • 加载
    • 链接
      • 验证
      • 准备
      • 解析
    • 初始化
  • 总结

首先我们先简单了解一下整个JVM的体系结构是怎样的,如下图所示(图1):
在这里插入图片描述
再详细具体一点(图2):
在这里插入图片描述
上面的图片有些地方看不懂没关系,先在脑子里大体有个印象。
我们这篇文章讲的是类的加载过程,所以在讲类加载之前先要知道类的生命周期是一个怎样的过程。
如下图所示(图3):
在这里插入图片描述

类的生命周期一共有5个阶段,分别是:
1.加载(Loading)
2.链接(Linking)
3.初始化(Initialization)
4.使用(Using)
5.卸载(UNLoading)

其中链接(Linking)阶段又可以细分为三个阶段:
1)验证(Verification)
2)准备(Preparation)
3)解析(Resolution)

今天我们只讲类的加载过程。如下图所示(图4):
在这里插入图片描述

类的加载

类的加载:指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。
类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。

类加载过程

通过以上图片我们可以看出类的加载过程是发生在类装载器子系统中的。

类装载器子系统:虚拟机把描述类的数据从class文件加载到内存,并对数据进行验证、准备、解析和初始化,最终形成可以被虚拟机直接使用的Java类型。

加载

加载是类加载过程的第一个阶段,不要将这2个概念混淆了。

1)通过一个类的全限定名来获取其定义的二进制字节流。
2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。
3)在Java堆中生成一个代表这个类的java.lang.Class对象,作为对方法区中这些数据的访问入口。

链接

验证

确保被加载的类的正确性。

验证是连接阶段的第一步,这一阶段的目的是为了确保Class文件的字节流中包含的信息符合

当前虚拟机的要求,并且不会危害虚拟机自身的安全。

  • 文件格式验证:验证字节流是否符合Class文件格式的规范,如:是否以模数0xCAFEBABE开头、主次版本号是否在当前虚拟机处理范围内等等。
  • 元数据验证:对字节码描述的信息进行语义分析,以保证其描述的信息符合Java语言规范的要求;如:这个类是否有父类,是否实现了父类的抽象方法,是否重写了父类的final方法,是否继承了被final修饰的类等等。
  • 字节码验证:通过数据流和控制流分析,确定程序语义是合法的、符合逻辑的,如:操作数栈的数据类型与指令代码序列能配合工作,保证方法中的类型转换有效等等。
  • 符号引用验证:确保解析动作能正确执行;如:通过符合引用能找到对应的类和方法,符号引用中类、属性、方法的访问性是否能被当前类访问等等。

验证阶段是非常重要的,但不是必须的,它对程序运行期没有影响,如果所引用的类经过反

复验证,那 么可以考虑采用-Xverifynone参数来关闭大部分的类验证措施,以缩短虚拟机类

加载的时间。

准备

为静态变量(类变量)分配内存并且设置该静态变量(类变量)的默认初始值,即零值。

这些内存都将在方法区中进行分配。

  • 只对static修饰的静态变量进行内存分配、赋默认值(如0、0L、null、false等)。
  • 对final的静态字面值常量直接赋初值(赋初值不是赋默认值,如果不是字面值静态常量,那么会和静态变量一样赋默认值)。

解析

将虚拟机常量池内的符号引用解析为直接引用,指到内存中的具体地址。

  • 解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程,解析动作主要针对类或接口、字段、类方法、接口方法、方法类型、方法句柄和调用限定符7类符号引用进行。符号引用就是一组符号来描述目标,可以是任何字面量。
    直接引用就是直接指向目标的指针、相对偏移量或一个间接定位到目标的句柄。

初始化

为类的静态变量赋初值。

初始化阶段是执行类构造器<clinit>()方法的过程。

类构造器<clinit>()方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块

(static块)中的语句合并产生的。也就是说,当我们代码中包含static变量的时候,就会有

<clinit>( )方法;如果当前类不存在static变量,那么它的字节码文件是不会存在<clinit>( )

  • <clinit>( )方法中的指令按语句在源文件中出现的顺序执行
  • <clinit>( )不同于类的构造器(构造方法)。(关联:构造器是虚拟机视角下的<init>( ))
  • 若该类具有父类,JVM会保证子类的<clinit>( )执行前,父类的<clinit>( )已经执行完毕
  • 虚拟机会保证一个类的<clinit>( )方法在多线程环境中被正确加锁和同步。

注意:需要明确类加载过程类初始化类的实例化区别,具体内容等再写一篇文章。

总结

最后用一张图总结这个过程。
在这里插入图片描述


http://chatgpt.dhexx.cn/article/vKVCoN8E.shtml

相关文章

什么是类的加载(Java)

一、什么是类的加载 java文件通过编译器变成了.class文件&#xff0c;接下来类加载器又将这些.class文件加载到JVM中。其中类装载器的作用其实就是类的加载。 其实&#xff0c;类加载器并不需要等到某个类被“首次主动使用”时再加载它&#xff0c;JVM规范允许类加载器在预料某…

【JVM】Java类加载机制详解

【JVM】Java类加载机制详解 文章目录 【JVM】Java类加载机制详解一&#xff1a;类加载子系统1&#xff1a;类加载器子系统的作用2&#xff1a;加载器 ClassLoader 的角色 二&#xff1a;类的加载过程1&#xff1a;加载阶段2&#xff1a;验证阶段&#xff1a;确保被加载的类的正…

JAVA开发(java类加载过程)

1、java语言的平台无关性。 因为java语言可以跑在java虚拟机上&#xff0c;所以只要能装java虚拟机的地方就能跑java程序。java语言以后缀名 .java为文件扩展名。通过java编译器javac编译成字节码文件.class 。java字节码文件通过java虚拟机解析运行。在虚拟机级别对class文件…

图解Java类加载机制

文章目录 前言类加载的概述双亲委派加载机制类加载的隔离机制contextClassLoaderSPI用处找文件用处 类加载的顺序顺序概述类加载的一般方式类加载的触发点 类的实例化多线程环境下&#xff0c;为何也只有一个Class的对象 图解和举例普通Java应用日常Web应用 附录 前言 网上有很…

【Java 】Java 类加载和类加载器

文章目录 前言一、加载二、链接验证准备解析 三、初始化发生的时机不会触发类的初始化 四、类加载器双亲委派模式 前言 Java 的类加载阶段分为&#xff1a;加载、链接、初始化&#xff0c;而链接的过程中包括&#xff1a;验证、准备、解析。 一、加载 将类的字节码载入方法区…

Java类加载过程图解

朋友给我发了一道有意思的题目&#xff0c;如下 为什么用.class的方式加载类和以Class.forName()的方式加载的结果不同呢&#xff0c;原因很简单&#xff0c;就是类加载过程的不同。 这就扯到基础理解上了&#xff0c;就是Java是如何加载一个类的呢&#xff1f; 上图是我绘制的…

Java类加载器加载类顺序

java ClassLoader的学习 java是一门解释执行的语言&#xff0c;由开发人员编写好的java源文件先编译成字节码文件.class形式&#xff0c;然后由java虚拟机(JVM)解释执行&#xff0c;.class字节码文件本身是平台无关的&#xff0c;但是jvm却不是&#xff0c;为了实现所谓的一次…

java类如何加载

最近研究java的进阶知识&#xff0c;先从java类加载机制学起&#xff0c;原先看过《深入理解java虚拟机》这本书&#xff0c;奈何书的知识面太广及自身只看了一遍&#xff0c;很多知识并不是很理解&#xff0c;今天看了几篇别人讲解的java类加载机制&#xff0c;觉得讲的很好&a…

JVM——Java类加载机制总结

1. 类加载器的组织结构 转载请注明出处&#xff1a;JVM——Java类加载机制总结_SEU_Calvin的博客-CSDN博客 类加载器 ClassLoader是具有层次结构的&#xff0c;也就是父子关系。其中&#xff0c;Bootstrap是所有类加载器的父亲。 &#xff08;1&#xff09;Bootstrapclass lo…

深入理解Java类加载器(1):Java类加载原理解析

1 基本信息 每个开发人员对java.lang.ClassNotFoundExcetpion这个异常肯定都不陌生&#xff0c;这背后就涉及到了java技术体系中的类加载。Java的类加载机制是技术体系中比较核心的部分&#xff0c;虽然和大部分开发人员直接打交道不多&#xff0c;但是对其背后的机理有一定理解…

深入理解Java类加载器(一):Java类加载原理解析

摘要&#xff1a; 每个开发人员对java.lang.ClassNotFoundExcetpion这个异常肯定都不陌生&#xff0c;这个异常背后涉及到的是Java技术体系中的类加载机制。本文简述了JVM三种预定义类加载器&#xff0c;即启动类加载器、扩展类加载器和系统类加载器&#xff0c;并介绍和分析它…

【Java · 类加载】类加载器

1. 概述 类加载器是 JVM 执行类加载机制的前提。 ClassLoader的作用&#xff1a; ClassLoader是Java的核心组件&#xff0c;所有的Class都是由ClassLoader进行加载的&#xff0c;ClassLoader负责通过各种方式将Class信息的二进制数据流读入JVM内部&#xff0c;转换为一个与目…

java类加载

当程序主动使用某个类时&#xff0c;如果该类还未被加载到内存中&#xff0c;则JVM会通过加载、连接、初始化3个步骤来对该类进行初始化。如果没有意外&#xff0c;JVM将会连续完成3个步骤&#xff0c;所以有时也把这个3个步骤统称为类加载或类初始化。 一、类加载过程 加载指…

Java的类加载

1、类的加载过程 Java文件通过javac编译成.class二进制字节码文件&#xff0c;然后交给类加载器加载到我们的虚拟机内存中,最后我们通过new 对象来实现对象的初始化&#xff0c;才能调用和执行这个类&#xff0c;类的加载有三步&#xff1a;加载、连接、初始化。 1.1、加载 …

Java类的加载

类的生命周期 当java源代码文件被javac编译成class文件后&#xff0c;并不能直接运行&#xff0c;而是需要经过加载&#xff0c;连接和初始化这几个阶段后才能使用。在使用完类或被销毁后&#xff0c;JVM会将类卸载掉。 类加载的过程 类加载的过程需要经过三个阶段分别是&a…

「WAVE SUMMIT 2022深度学习开发者峰会」火热来袭

「WAVE SUMMIT 2022深度学习开发者峰会」火热来袭&#xff01; 会上您将了解以飞桨为代表的深度学习领域的最新技术突破&#xff01; 看最新的AI技术如何助力我国产业发展&#xff0c;先人一步了解技术风向。 5月20日 13:00期待与您相聚云端 报名即送好礼&#xff0c;快来参与吧…

Wave(.wav)文件格式

Wave文件格式主要是用来存储音频PCM数据的&#xff0c;其实也可以存储非PCM音频数据&#xff0c;这种情况我们就不考虑了。文件的扩展名为“.wav”&#xff0c;采用RIFF文件结构。 一、RIFF文件格式简介 1、RIFF文件是由一个一个的chunk组成的&#xff0c;并且chunk之间可以嵌…

wave文件格式

Wave文件采用RIFF文件格式&#xff0c;总体来看Wave文件是由多个chunk嵌套组成的&#xff1b;Wave文件最外层是一个标识为"RIFF"的类型块chunk1&#xff1b;在chunk1的data部分嵌套了2个chunk&#xff0c;即chunk2和chunk3&#xff1b;chunk2的标识为"fmt"…

WAVE 文件格式分析

WAVE 文件作为多媒体中使用的声音波形文件格式之一&#xff0c;它是以RIFF&#xff08;Resource Interchange File Format&#xff09;格式为标准的。每个WAVE文件的头四个字节便是“RIFF”。WAVE 文件由文件头和数据体两大部分组成。其中文件头又分为 RIFF&#xff0f;WAV 文件…

html wave标签,html wave的实现

如何实现wave动画?求demo 我理解的关键点: 1、色彩的均匀渐变,比较柔和,没有明显的过渡层 2、不同频率的正弦波 我的实现: 效果相差很大! let canvas1 = document.querySelector(#canvas1); let ctx = canvas1.getContext(2d); canvas1.width = canvas1.parentNode.offset…