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

article/2025/10/12 5:53:10

文章目录

  • 前言
  • 一、加载
  • 二、链接
    • 验证
    • 准备
    • 解析
  • 三、初始化
    • 发生的时机
    • 不会触发类的初始化
  • 四、类加载器
    • 双亲委派模式

前言

Java 的类加载阶段分为:加载、链接、初始化,而链接的过程中包括:验证、准备、解析。

一、加载

将类的字节码载入方法区中,内部采用 C++ 的 instanceKclass 描述 Java 类

instanceKclass 的重要字段:

  • _java_mirror:Java 类镜像,存放类对象的地址,例如对于 String,存放的就是String.class
  • _super:即父类
  • _methods:即方法
  • _constants:即常量池
  • _class_loader:类加载器
  • _vtable:虚方法表
  • _itable:接口方法表

在这里插入图片描述

二、链接

链接阶段包括验证、准备、初始化三个部分

验证

验证类是否符合 JVM 规范,进行安全性检查,例如:检查 Java 文件的魔数

准备

为 static 变量分配地址空间,设置默认值

  • static 变量分配空间和赋值是两个步骤,分配空间是在准备阶段完成,而赋值是在初始化阶段完成;
  • 若 static 变量是 final 类型的,且变量类型为基本数据类型或者字符串对象,则在准备阶段进行赋值;
  • 若 static 变量是 final 类型的,且变量类型为引用对象,则仍在初始化阶段进行赋值;

解析

将常量池中的符号引用解析为直接引用

三、初始化

初始化调用 ()v,即执行类的构造方法,代码块等,虚拟机会保证这个类的线程安全

发生的时机

概括的说,类的初始化是懒惰的

  • main 方法所在的类,总会被首先初始化;
  • 首次访问类的静态变量或者静态方法,因为这些变量不是 final 的,会在类的初始化阶段进行赋值;
  • 子类初始化,会引起父类的初始化;
  • 子类方法父类的静态变量,会导致父类的初始化;
  • Class.forName;
  • new 会导致初始化;

不会触发类的初始化

  • 访问类的 static final 静态变量(基本类型和字符串),不会被初始化,因为这些变量的赋值是在准备阶段;
  • 类对象.class 不会触发类的初始化;
  • 创建该类的数组不会触发初始化;
  • 类加载器的 loadClass 方法;
  • Class.forName 的参数 2 为 false 时

四、类加载器

以 JDK8 为例

名称加载哪里的类说明
Bootstrap ClassLoaderJAVA_HOME/jre/lib无法直接访问
Extension ClassLoaderJAVA_HOME/jre/lib/ext上级为 Bootstrap ClassLoader,访问为 null
Application ClassLoaderclasspath上级为 Extension ClassLoader
自定义类加载器自定义上级为 Application ClassLoader

类加载器的作用:加载类的二进制字节码

双亲委派模式

双亲委派模式是一种Java类加载机制,它定义了一种层次化的父子关系,由父类加载器向下委派请求,直到找到合适的类加载器为止。

  • 首先会检查缓存,查找该加载器是否已经加载过这个类了,如果没有就去父类的加载器中去寻找;
  • 如果缓存中没有找到,就会自顶而下用的类加载器去创建该类;
  • 最终返回该类即可;
protected Class<?> loadClass(String name, boolean resolve)throws ClassNotFoundException{synchronized (getClassLoadingLock(name)) {// First, check if the class has already been loaded// 检查缓存,是否已经加载过这个类Class<?> c = findLoadedClass(name);if (c == null) {long t0 = System.nanoTime();try {if (parent != null) {// 向上级的累加器中找c = parent.loadClass(name, false);} else {// 向 Bootstrap 类加载器中找c = findBootstrapClassOrNull(name);}} catch (ClassNotFoundException e) {// ClassNotFoundException thrown if class not found// from the non-null parent class loader}// 如果缓存没有找到,就去创建if (c == null) {// If still not found, then invoke findClass in order// to find the class.long t1 = System.nanoTime();// 调用 findClass 去创建类c = findClass(name);// this is the defining class loader; record the statssun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);sun.misc.PerfCounter.getFindClasses().increment();}}if (resolve) {resolveClass(c);}return c;}}

http://chatgpt.dhexx.cn/article/79U4iZ6n.shtml

相关文章

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…

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的推…