Java-类加载过程

Java 的类加载过程是怎样的? 通过加载器,Java 能够在运行时灵活加载类,实现模块化设计、插件机制等功能。文件中的字节码加载到 JVM 中,并进行验证、解析和初始化,最终使类能够使用的过程。是 Java 虚拟机(JVM)中负责将类的字节码加载到内存中的组件。Java 的类加载过程实现了字节码的动态加载、验证与管理,保证了 Java 程序的安全性和平台无关性。加载器是 Java 动态类加载机制的核心部分,允许在运行时加载类,而不是在编译时确定所有类。类加载器负责查找并加载类的字节码。Java 的类加载过程是怎样的? 阅读详情

Java-类加载过程

  • Java虚拟机类加载全过程包括 加载,验证,准备,解析和初始化
    avator

1.加载

  • 加载是整个类加载过程中的一个阶段,完成的事情:
    • 通过一个类的全限定名来获取此类的二进制字节流
      • 注意这里不一定非要从一个Class文件中获取,也可以从ZIP包中,运行时计算中得到
    • 将这个字节流代表的静态存储结构转化为方法区的运行时数据结构
    • 在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口
  • 加载阶段既可以使用Java虚拟机内置的引导类加载器来完成,也可以由用户自定义的类加载器完成
  • 数组本身不通过类加载器创建,而是由Java虚拟机直接在内存中动态构造出来的

2.验证

  • 为了确保Class文件的字节流中包含的信息是否符合当前虚拟机的要求,不危害虚拟机安全

  • 文件格式验证: 验证字节流是否符合Class文件格式规范

    • 主次版本号是否在JVM接收范围
    • 常量池的常量中是否有不被支持的常量类型
  • 元数据验证: 对字节码描述的信息进行语义分析

    • 这个类是否有父类
    • 父类是否继承了不该继承的类(比如被final修饰的类)
  • 字节码验证: 验证阶段最复杂的阶段,通过数据流和控制流分析,确定程序语义是合法,符合逻辑的

    • 保证任意时刻操作数栈的数据类型与指令代码序列都能配合工作
    • 保证任何跳转指令都不会跳转到方法体以外的字节码指令
  • 符号引用验证: 发生在虚拟机将符号引用转为直接引用的时候

    • 符号引用中通过字符串描述的全限定名是否能找到对应的类
    • 在指定类中是否存在符合方法的字段描述符及简单名称所描述的方法和字段

3.准备

  • 是正式为类中定义的变量(即静态变量)分配内存并设置初始值,应当在方法区分配;JDK7之前HotSpot使用永久代实现方法区,内存分配在方法区,JDK8及之后,类变量会随着Class对象一起放在Java堆

    public static int value = 8000;
    实际上value在准备阶段的初始值为0而不是8000,将value赋值为8000是在程序被编译后,存放在构造器<clinit>()方法中
    
    public static final int value = 10;
    在编译阶段会为value生成ConstantValue属性,在准备阶段会赋值为10
    

4.解析

  • 解析阶段是Java虚拟机将常量池内的符号引用转化为直接引用的过程

  • 符号引用就是class文件中的CONSTANT_Class_info、 CONSTANT_Fieldref_info、CONSTANT_Methodref_info等类型的常量

  • 符号引用: 一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能无歧义地定位到目标即可,引用的目标并不一定是已经加载到虚拟机内存当中的内容。

  • 直接引用: 是可以直接指向目标的指针、相对偏移量或者是一个能间接定位到目标的句柄;如果有直接引用,那引用的目标必定存在;直接引用是和虚拟机实现的内存布局直接相关的,同一个符号引用在不同虚拟机实例上翻译出来的直接引用一般不会相同


5.初始化

  • 初始化阶段是类加载的最后一个阶段,除了在加载阶段可以自定义类加载器以外,其它操作都是JVM主导。到了初始化阶段,才开始真正执行类中定义的java代码

  • 初始化阶段就是执行类构造器()方法的过程

  • <clinit>()方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块(static{}块)中的语句合并产生的

  • 如果一个类中没有对静态变量赋值也没有静态语句块,编译时可不用生成()方法

  • 以下情况不会进行初始化

    • 通过子类用用父类的静态字段,只会出发父类的初始化,不会出发子类的初始化
    • 定义对象数组不会出发该类的初始化
    • 通过类名获取Class对象,不会触发初始化
    • 通过ClassLoader默认的LoadClass方法也不会出发初始化
Java基础:类加载的过程 Java类加载是将字节码文件加载到JVM内存并转换为可执行类型的过程,包含7个生命周期阶段(加载、验证、准备、解析、初始化、使用、卸载)。核心流程包括:通过ClassLoader获取字节流(加载)、验证安全性(验证)、分配静态变量内存(准备)、替换符号引用(解析)和执行初始化代码(初始化)。类加载器采用双亲委派模型确保核心类安全,其中Bootstrap、Extension和Application类加载器分别负责不同层级的加载。 阅读详情

相关推荐

Java 类加载的过程

各种虚拟机实现的内存布局可以各不相同,但是它们能接受的符号引用必须都是一致的,因为符号引用的字面量形式明确定义在《Java虚拟机规范》的Class文件格式中。类型数据妥善安置在方法区之后,会在Java堆内存中实例化一个java.lang.Class类的对象,这个对象将作为程序访问方法区中的类型数据的外部接口。类的初始化阶段是类加载过程的最后一个步骤,之前介绍的几个类加载的动作里,除了在加载阶段用户应用程序可以通过自定义类加载器的方式局部参与外,其余动作都完全由Java虚拟机来主导控制。

流楚丶格念的博客 3382

Java类加载过程详解

首先我们应明确在Java中类的生命周期是什么,引用一张图像进行说明使用(Using)卸载(Unloading)

chris3will的博客 5247

揭秘大型语言模型:从神经元到思维透明的奇妙旅程

这篇博客带你走进大型语言模型的内部世界,从神经元的小任务,到功能向量的团队合作,再到层间的协作和思维的透明化。掌握这些知识,能让你在开发中更高效地优化AI,在研究中更深入地探索模型的奥秘。建议多动手实践,把这些理论变成自己的能力!

数据与算法架构提升之路专栏 1521

Java类的加载过程

应用程序根据自身需要自定义的ClassLoader,如Tomcat、Jboss都会根据j2ee规范实现ClassLoader。

w1lgy的博客 9566

224G PAM-4 通道的 PCB 和封装设计

该行业正在努力实现层厚非常低的 sub-Dk = 3 材料,以及更先进的加工,这将使封装和 PCB 中的透射电镜截止值更高。当回波损耗占主导地位时,我们基本上需要去除沿互连产生阻抗失配的任何元件,就像上面描述的更光滑的铜和更低的 Dk 值一样。第二个影响是传输线阻抗匹配在 56 GHz 范围内的非常高的频率下非常困难的主要原因之一,另一个因素是 Tx 或 Rx 封装/缓冲器中的寄生效应。由于 PCB 和封装中的长度刻度,这是 BGA 上的焊盘、过孔和球等小结构开始在输入阻抗中产生明显偏差的频率范围。

jkh920184196的博客 842

【Docker】Docker安装Hadoop分布式集群

hadoop目录安装在:/usr/local/hadoop-2.7.0/etc/hadoop。访问Hadoop102:9870,查看是否能够看到hdfs界面。访问hadoop103:8088,查看能够看到yarn界面。在yarn上可以看到执行情况。

weixin_46429290的博客 3461

Java中类加载过程详解

而我们自定义的类加载器的实例是可以被回收的,所以使用我们自定义加载器加载的类是可以被卸载掉的。一个非数组类的加载阶段(加载阶段获取类的二进制字节流的动作)是可控性最强的阶段,这一步我们可以去完成还可以自定义类加载器去控制字节流的获取方式(重写一个类加载器的。综上,解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程,也就是得到类或者字段、方法在内存中的指针或者偏移量。综上,解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程,也就是得到类或者字段、方法在内存中的指针或者偏移量。

2401_86844317的博客 2934

避坑指南:SAP STO订单里‘发货存储地点’栏位不显示?检查这个关键配置

本文深入解析SAP STO订单中‘发货存储地点’栏位缺失问题的根本原因及解决方案。通过激活库存地点间转储功能、维护库存地点主数据等关键配置步骤,帮助用户快速恢复业务操作。特别适用于MM模块实施顾问和SAP系统管理员处理UB STO相关技术问题。

weixin_30632089的博客 99

Java类加载过程是怎么样的?

Java类加载过程可以分为加载、验证、准备、解析和初始化五个阶段。下面我会详细解释每个阶段,并给出相应的代码演示。

Blue92120的博客 1554

CY7C68013 C0模式启动

C0或是C2启动的目的,是更改USB芯片的ID信息,并把固件载入到芯片内部RAM中运行。C0模式是指只从EEPROM中载入USB ID信息,因为只有ID信息(8个字节),所以只需要一个小容量的EEPROM即可。当然大容量的EEPROM也可以使用C0模式,但是小容量的EEPROM只能使用C0模式启动。如下图所示: 使用小容量的EEPROM要将A0,A1,A2接地。 这里我用了个24LC01,容量1

Fezl的博客 1740

自动驾驶---Planning模块详细介绍(以Apollo为例)

主要介绍高速场景下Planning模块,至于低速的泊车场景对比高速场景或者城区场景有比较大的差距(后面也会介绍泊车场景),本篇Planning介绍主要包括三大子模块Routing,Behavioural Planning以及Motion Planining,并且对比较重要的Decider和Optimizer都做了通俗化的说明供大家思考,以便于后续理解更深入的内容,后面有时间会再开一些篇幅对这些模块进行更加深入的讲解。

智能汽车人的博客 2087

【JAVA】类加载过程,以及类加载器

启动类加载器(Bootstrap Class Loader):负责加载Java的核心类库,例如java.lang.Object等。扩展类加载器(Extension Class Loader):负责加载Java的扩展类库,例如java.lang.String等。应用程序类加载器(Application Class Loader):也称为系统类加载器,负责加载应用程序的类,例如项目中自定义的类。自定义类加载器:开发者可以根据需要编写自定义的类加载器,用于加载特定的类或者资源。

代码的魅力,根本走不出来 2200

SAP_MM/CO模块-超详细的CK11N/CK40N取值逻辑梳理(十几种业务场景,1.76W字)

本文主要讲述的是三个大的知识点,超详细,涉及到知识点比较多,并且串起来讲解,这也是我在网上搜不到相关资料才自己慢慢研究测试出来的,断断续续耗费了我一周多时间,相信只要你们认真看完,肯定会有所收获; 1、CK11N/CK40N成本发布功能中,系统前台的取数逻辑,涉及到多个采购信息记录、生产版本、货源清单、配额协议等对成本价发布的影响~~!! 2、CK11N与CK40N发布的成本价不一致的问题~~!! 3、如何处理外协加工物料的外协价与BOM组件成本取值不匹配的问题~~!!

风沙的博客 4089

Java类加载过程

类加载过程 加载->连接->初始化。连接过程⼜可分为三步:验证->准备->解析 加载 通过全类名获取定义此类的⼆进制字节流 将字节流所代表的静态存储结构转换为⽅法区的运⾏时数据结构 在内存中⽣成⼀个代表该类的 Class 对象,作为⽅法区这些数据的访问⼊⼝ ⼀个⾮数组类的加载阶段(加载阶段获取类的⼆进制字节流的动作)是可控性最强的阶段,这⼀步我们可以去完成还可以⾃定义类加载器去控制字节流的获取⽅式(重写⼀个类加载器的 loadClass() ⽅法)。数组类型不通过类加载器创建,它

J.K.Yang的博客 393

SMMU软件指南SMMU编程之流表(Stream Table)

SMMU使用一组内存中的数据结构来定位翻译数据,详见“转换过程概述”(Translation process overview)。SMMU_(*_)STRTAB_BASE 存储初始结构(流表,Stream Table)的基地址。流表项(Stream Table Entry, STE)包含二级(Stage 2)转换表的基址指针,同时也定位一级(Stage 1)配置结构,这些配置结构包含转换表的基址指针。 传入事务的 StreamID,由 SEC_SID 进行限定,决定了用于查找的流表,并定位相应的STE。

AI-安全-功耗 1189

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Java 类加载过程

加载:在该阶段,类的字节码文件被加载到内存中,并被存储在方法区中的运行时常量池内。验证:在验证阶段,对字节码文件的合法性进行检查,以确保它满足Java虚拟机的规范要求,并且不会对虚拟机产生安全风险。准备:在准备阶段,为类的静态变量分配内存,并设置默认初始值。解析:在解析阶段,将常量池中的符号引用转换为直接引用。初始化:在初始化阶段,对类的静态变量进行初始化,并执行静态代码块。使用:在使用阶段,类被加载到内存中,并可以被其他类引用和使用。

Flying_Fish_roe的博客 906

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Java面试必备:Java类加载过程详解

Java虚拟机(JVM)加载Class文件到内存,并对数据进行校验、转换解析和初始化,最终形成可以被JVM直接使用的Java类型,这个过程称为类加载。

qq_58299462的博客 1104

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java中的类加载过程

类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型。

Black_cat_look的博客 1251

JAVA类加载过程

1. JVM类加载过程 1.概述 从类的生命周期而言,一个类包括如下阶段: 加载、验证、准备、初始化和卸载这5个阶段的顺序是确定的,类的加载过程必须按照这种顺序进行,而解析阶段则不一定,它在某些情况下可能在初始化阶段后在开始,因为java支持运行时绑定。 2. 类加载时机 加载(loading)阶段,java虚拟机规范中没有进行约束,但初始化阶段,java虚拟机严格规定了 有且只有如下5种情况必须立即进行初始化(初始化前,必须经过加载、验证、准备阶段): (1)使用new实例化对象时,读取和设置类

代码大师麦克拉瑞的博客 2191

JAVA对象创建过程和类加载过程

fill:#333;color:#333;color:#333;fill:none;加载验证准备解析初始化使用卸载。

huing的博客 828

反无人机C2指控AI大模型本地部署:从车载到指挥中心的硬件选型实战

AI大模型在军事指挥控制(C2)和反无人机等关键任务场景中的应用正加速落地,本地化部署成为保障数据安全、降低通信时延的必然趋势。然而,硬件选型往往成为决定系统成败的首要难题:算力、显存、功耗与物理形态如何精准匹配任务剖面?从车载边缘节点的轻量化推理,到区域指控中心的多路并发分析,再到大型指挥中心的算力池设计,不同层级对GPU、内存、存储及供电的需求差异巨大。模型量化策略、推理框架选择及多模态、RAG、AI Agent等增量因素,同样反向制约着硬件配置。基于实际项目经验,从算力测算方法论与避坑指南出发,解析反

weixin_34195364的博客 231

Java的类加载过程

就是把类(通常是.class文件的形式)通过类加载器加载到 JVM 中,经过一系列的解析成可用的 class 类二进制流的来源可能有:编译后的.class文件使用ASM、ByteBuddy等字节码生成工具创建的字节码甚至可以从网络传输得到,只要它符合Java字节码的格式,JVM都能够接受并处理。

欢迎来到空说的博客 666

【JAVA】聊聊类加载过程

Java 通过引入字节码和 JVM 机制,提供了强大的跨平台能力,理解 Java 的类加载机制是深入 Java 开发的必要条件。本篇博文的重点是,请介绍类加载过程,什么是双亲委派模型? 一般来说,我们把 Java 的类加载过程分为三个主要步骤:加载、链接、初始化,具体行为在 Java 虚拟机规范里有非常详细的定义。首先是加载阶段(Loading),它是 Java 将字节码数据从不同的数据源读取到 JVM 中,并映射为 JVM 认可的数据结构(Class 对象),这里的数据源可能是各种各样的形态,如 jar

ZLF_1024的博客 252

java类加载过程和类加载器

java类加载过程和类加载器 一:类加载概述 首先我们了解一下类是怎么进入内存的,jvm把class文件加载到内存,然后对文件进行校验,转换解析和初始化变 成可以被虚拟机直接利用的java类型,这就是虚拟机的类加载机制。java类的加载,链接和初始化都是在运行阶段进行 的,这虽然会带来一定的性能开销,却在灵...

0bug0warning的博客 333

类加载过程 JAVA

自定义类加载器是为了加载在jvm三个加载器负责的目录范围之外的类/*** @Description: 自定义类加载器} //parent: 指定父加载器, AppClassLoader/ExtClassLoader/Bootstrap public MyClassLoader(ClassLoader parent , String classPath) {//要求返回的是你要加载的字节码文件的Class对象. //这里都是我们说了算的。

DarkPumpkin的博客 1067
上一篇: Java--异常
下一篇: 操作系统-进程
广州彭于晏
博客等级 码龄8年 10粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值