JVM——Java类加载机制总结

article/2025/10/12 6:49:44

1. 类加载器的组织结构

转载请注明出处:JVM——Java类加载机制总结_SEU_Calvin的博客-CSDN博客

类加载器 ClassLoader是具有层次结构的,也就是父子关系。其中,Bootstrap是所有类加载器的父亲

(1)Bootstrapclass loader 启动类加载器

当运行Java虚拟机时,这个类加载器被创建,它负责加载虚拟机的核心类库,如java.lang.*等。

(2)Extensionclass loader:标准扩展类加载器

用于加载除了基本 API之外的一些拓展类

(3)AppClassLoader加载应用程序和程序员自定义的类

运行下面的程序,结果也显示出来了:

从运行结果可以看出加载器之间的父子关系,ExtClassLoader的父Loader返回了null

原因是BootstrapLoader(启动类加载器)是用C语言实现的,找不到一个确定的返回父Loader的方式。

2. 类的加载机制

类被加载到虚拟机内存包括加载、链接、初始化几个阶段。其中链接又细化分为验证、准备、解析。

这里需要注意的是,解析阶段在某些情况下可以在初始化阶段之后再开始,这是为了支持Java的运行时绑定。各个阶段的作用整理如下:

 

2.1 加载阶段

加载阶段可以使用系统提供的类加载器(ClassLoader)来完成,也可以由用户自定义的类加载器完成,开发人员可以通过定义类加载器去控制字节流的获取方式

1通过类的全名产生对应类的二进制数据流

2)将这些二进制数据流转换为方法区的运行时数据结构

3)创建代表这个类的java.lang.Class对象。作为方法区这些数据的访问入口

 

2.2 链接阶段(实现 Java 的动态性的重要一步)

1验证:验证阶段的主要目的是确保class文件字节流的正确性,要验证比如class文件格式规范、这个类是否继承了final类、不能把一个父类对象赋值给子类数据类型等等。

2准备:准备阶段为方法区中的静态变量分配内存空间。并将其赋值为初始值,所有原始类型的值都为0。如float0f int0boolean0、引用类型为null

3解析:解析阶段把符号引用解析为直接引用

符号引用是一个字符串,它唯一标识一个类、一个字段、一个方法等目标。

而直接引用对于类变量、类方法指的是指向方法区的指针,然后对于实例方法、实例对象来说就是偏移量,比如一个实例方法,子类中方法表中的偏移量和父类是一致的,这个偏移量可以确定某个方法的位置。

 

2.3 初始化

到了初始化阶段,才是真正执行用户定义程序代码。在初始化阶段就是执行类构造器方法的过程,工作包括赋值类变量、静态语句块的合并

//定义在静态语句块之后的变量可以赋值,但不能访问
public class Test{static{i=0;//給变量赋值,可以通过编译System.out.print(i);//这句编译器会提示非法向前引用}static int i=1;
}

初始化过程会被触发的条件汇总:

1)使用new关键字实例化对象、访问一个类的静态字段静态方法的时候。

2对类进行反射调用的时候。

3)当初始化子类时,如果发现其父类还没有进行过初始化,则进行父类的初始化

 

【关于构造器方法拓展知识】(可以不看)

1)类构造器<clinit>()方法与类的构造函数不同,它不需要显式调用父类构造,虚拟机会保证在子类<clinit>()方法执行之前,父类的<clinit>()方法已经执行完毕。因此在虚拟机中的第一个执行的<clinit>()方法的类肯定是java.lang.Object

2)由于父类的<clinit>()方法先执行,也就意味着父类中定义的静态语句块要优先于子类的变量赋值操作。

3<clinit>()方法不是必须的,如果一个类中没有静态语句,那么编译器可以不为这个类生成<clinit>()方法。

4接口中不能使用静态语句块,和类不同的是,执行接口的<clinit>()方法不需要先执行父接口<clinit>()方法。只有当父接口中定义的变量被使用时,父接口才会被初始化。另外,接口的实现类在初始化时也一样不会执行接口的<clinit>()方法。

5)虚拟机会保证一个类的<clinit>()方法在多线程环境中被正确加锁和同步,可能会导致阻塞。

3. 类加载的三种方式

1)由 new 关键字创建一个类的实例。

2)调用 Class.forName() 方法,通过反射加载类。

3)调用某个ClassLoader实例的loadClass()方法。

 

三者的区别汇总如下:

1)方法12都是使用的当前类加载器。方法3是用户指定的类加载器加载

2)方法1是静态加载,23是动态加载。

3)对于两种动态加载,如果程序需要类被初始化,就必须使用Class.forName(name)的方式

Class.forName(className);
//实际上是调用的是:
Class.forName(className, true, this.getClass().getClassLoader());//第二个参为true即默认类需要初始化,初始化会触发目标对象静态块的执行和静态变量的初始化
ClassLoader.loadClass(className);
//实际上调用的是:
ClassLoader.loadClass(name, false);//第二个参数即默认得到的class还没有进行链接,意味着不进行初始化等系列操作,即静态代码块不会执行


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

相关文章

深入理解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…

802.11ac Wave2 将为WIFI性能和效果带来提升

Wi-Fi联盟推出的第二代802.11ac认证项目&#xff0c;使Wi-Fi网络的速度和效率又向前迈了一大步。 802.11ac正式颁布于2014年&#xff0c;标准包含了很多新特性&#xff0c;这些特性受到了Wi-Fi供应商和消费者的欢迎&#xff0c;特性包括&#xff1a; 采用5GHz频段 更宽的通道 更…

802.11ac wave2的前世今生

2015年下半年&#xff0c;高通、博通、RTL等芯片厂商相继发布了满足802.11ac wave2要求的芯片&#xff0c;WLAN及终端厂商也迅速跟进推出相应的产品和终端。802.11ac wave2在多方推动下于2015年底实现了商用&#xff0c;标志着802.11ac进入了新的发展阶段。 突破多用户并发能力…

什么是Wi-Fi Wave 2?

802.11ac的第二波浪潮(即Wave 2)已经拍到了岸边&#xff0c;而新的MU-MIMO(多用户、多路输入多路输出)技术也正在引起业界的骚动。它正是我们已经看到的Wi-Fi的巨大潜力之一&#xff0c;可大大提升无线网络的吞吐量&#xff0c;并将在密度和容量上与之前的无线网络产生巨大差异…

什么是802.11ac和802.11ac Wave2

什么是802.11ac和802.11ac Wave2 简介什么是802.11ac802.11ac VS 802.11n802.11ac Wave1的关键技术802.11ac Wave2 VS 802.11ac Wave1802.11ac Wave2的关键特性 简介 从1997年第一代802.11标准802.11发布至今&#xff0c;Wi-Fi经历了巨大的发展和普及&#xff0c;802.11ac的推…

wave2lip训练

论文&#xff1a;https://arxiv.org/pdf/2008.10010.pdf 训练源码&#xff1a;https://github.com/Rudrabha/Wav2Lip 经过调整过的代码&#xff1a;https://gitee.com/sparkle__code__guy/wave2lip ffmpeg的安装&#xff1a;https://blog.csdn.net/sslfk/article/details/1…

802.11ac wave 2:你需要知道的6件事

Wi-Fi联盟是全球非盈利性组织&#xff0c;旨在改善Wi-Fi技术的互操作性。近日&#xff0c;Wi-Fi联盟认证了802.11ac wave 2标准&#xff0c;新标准带来了一系列的更新&#xff0c;最终可能会影响消费者及企业的日常连接。 下面让我们看看这六个性能变化&#xff1a; 1.可能实现…

被吹上天的802.11ac Wave2到底好在哪?还有,Wave1哪去了?

802.11ac Wave2到底好在哪&#xff1f; 在说Wave2之前&#xff0c;我们先要了解802.11ac是什么&#xff0c;它的特点是什么。IEEE 802.11ac是802.11的一个通信标准&#xff0c;802.11n的升级版。再具体的渊源这里就不讲了&#xff0c;感兴趣的可自行查阅资料。重点来了&#x…

Java拦截器HandlerInterceptor重写preHandle方法时HttpServletRequest无法获取自定义请求头参数问题

问题描述 在前端vue中设置的自定义请求头参数&#xff1a;token 控制层可以正常获取到自定义请求头参数 拦截器中无法获取 下方是拦截器代码 Component public class JWTInterceptor implements HandlerInterceptor {private final Logger logger LoggerFactory.getLogge…