深入理解 JVM 类加载机制:从加载到初始化的全过程

【深入理解JVM】:类加载机制 概述虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。与那些在编译时需要进行链接工作的语言不同,在Java语言里,类型的加载、连接和初始化过程都是在程序运行期间完成的,例如import java.util.*下面包含很多类,但是,在程序运行的时候,虚拟机只会加载哪些我们程序需要的类。这种策略虽然会 阅读详情

在这里插入图片描述

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~
个人主页:.29.的博客
学习社区:进去逛一逛~

在这里插入图片描述


简介:

Java 虚拟机(JVM)的类加载机制是 Java 程序运行的基础,它确保了字节码文件在运行时被正确加载、验证和执行。JVM 类加载机制分为五个关键阶段——加载、验证、准备、解析和初始化。

类加载机制概述:

JVM 的类加载机制是一个分阶段的过程,每个阶段都有明确的任务和目标。通过这种逐步加载的方式,JVM 保证了类的安全性和一致性。以下是类加载机制的五个主要阶段:

  1. 加载 (Loading)
  2. 验证 (Verification)
  3. 准备 (Preparation)
  4. 解析 (Resolution)
  5. 初始化 (Initialization)



1. 加载 (Loading)

定义与任务

加载是类加载过程的第一个阶段。在这个阶段中,JVM 会完成以下几项任务:

  • 查找并加载字节码文件:JVM 会根据类的全限定名找到对应的 .class 文件,或者从其他来源(如网络、数据库等)获取字节码。
  • 生成 java.lang.Class 对象:在方法区(或元空间,取决于 JVM 实现)中创建一个代表该类的 java.lang.Class 对象,作为该类在 JVM 内部的数据入口。
  • 存储类信息:将类的二进制数据(包括类的版本、字段、方法、接口等信息)加载到内存中,并存放在方法区。



2. 验证 (Verification)

定义与任务

验证阶段的主要目的是确保字节码文件的完整性和安全性。具体来说,验证器会检查以下内容:

  • 文件格式验证:确认字节码文件符合 Java 类文件格式规范。
  • 元数据验证:检查类的元数据是否合法,例如是否有重复的字段或方法签名。
  • 字节码验证:确保字节码不会破坏 JVM 的安全模型,例如非法的操作码或不合理的跳转指令。
  • 符号引用验证:验证所有符号引用指向的类和成员是否存在且可访问。

目的

验证阶段的存在是为了防止恶意代码或损坏的字节码对 JVM 造成危害,从而保障 JVM 的安全性和稳定性。




3. 准备 (Preparation)

定义与任务

准备阶段的主要任务是在方法区中为类变量分配内存空间,并设置默认初始值。需要注意的是:

  • 基本类型:为 byte、short、int 分配 0,long 分配 0L,float 分配 0.0f,double 分配 0.0d,char 分配 \u0000。
  • 引用类型:为对象引用类型的类变量分配 null。
  • 常量赋值:如果类变量声明为 public static final,则直接赋给指定的常量值(例如 public static final int PORT = 8080 会被直接赋值为 8080)。

注意

准备阶段并不会为实例变量分配内存,这些将在对象实例化时进行。




4. 解析 (Resolution)

定义与任务

解析阶段的主要任务是将常量池中的符号引用转换为直接引用。符号引用通常包含以下几种类型:

  • CONSTANT_Class_info:表示类或接口的符号引用。
  • CONSTANT_Field_info:表示字段的符号引用。
  • CONSTANT_Method_info:表示方法的符号引用。

直接引用是指可以直接定位到目标实体的指针、相对偏移量或句柄。解析完成后,JVM 可以直接使用这些直接引用来访问类、字段和方法。




5. 初始化 (Initialization)

定义与任务

初始化阶段是类加载过程的最后一个阶段,也是真正开始执行类中代码的阶段。在这个阶段中,JVM 会执行以下操作:

  • 静态变量赋值:为类中的静态变量赋予显式赋值。
  • 静态代码块执行:执行静态代码块中的代码。
  • 父类初始化:先初始化父类,再初始化子类。

静态变量与静态代码块的执行顺序按照代码编写时的先后顺序执行。

初始化顺序

  • 类的初始化顺序:静态变量显示赋值 -> 静态代码块(按顺序执行)
  • 实例的初始化顺序:非静态变量显示赋值 -> 非静态代码块(按顺序执行) -> 构造器方法



总结:

JVM 类加载机制通过五个阶段——加载、验证、准备、解析和初始化,确保了 Java 应用程序能够在不同平台上稳定、安全地运行。每个阶段都有其特定的任务和目标,共同构成了 Java 的“一次编写,到处运行”的强大特性。

在这里插入图片描述

深入理解JVM类加载机制:从原理到实践 类加载机制是JVM将类的字节码文件加载到内存中,并转换为JVM能够识别的数据结构的过程。加载(Loading):查找并加载类的字节码文件。链接(Linking):验证类的正确性,为静态变量分配内存并解析符号引用。初始化(Initialization):执行类的静态初始化代码。用户可以通过继承类实现自定义类加载器,用于加载特定来源的类。在某些场景下,我们可能需要自定义类加载器,例如从网络、数据库或其他非标准来源加载类。@Override// 自定义加载逻辑// 从自定义来源加载类的字节码。 阅读详情

相关推荐

jdk9 Jvm的类加载机制

前言 昨天说今天更新一些jvm的内容。jvm的类加载模型在jdk9发生过变化。现在我们从jdk7以前开始谈起,聊一聊jvm的类加载机制。 标题上的内容在最后,只想看变化的往后翻。 文中内容大量取自 周志明 深入理解jvm 第三版 类加载的时机 .class文件平常是躺在磁盘上的,而我们需要使用它的时候就需要把它加载到内存中去,当我们不再使用它就应该把它卸载。 一个类从加载到虚拟机开始直...

xiaoy990的博客 1070

深入解析Java类加载机制

本文详细解析了Java类加载机制,主要包括:1.类加载的生命周期(加载、验证、准备、解析、初始化、使用、卸载);2.三层类加载器(启动类、扩展类、应用类)及其双亲委派模型;3.自定义类加载器的实现方法和应用场景;4.类卸载的条件和类加载的高级特性(命名空间、线程上下文加载器等)。该机制是JVM的核心功能,理解其原理对框架开发、热部署实现和解决类冲突等问题具有重要意义。

LTJ_18的博客 332

保姆级教程:用Protege 5.5.0从零构建你的第一个知识图谱(附实战案例文件)

本文提供了一份详细的Protege 5.5.0使用指南,从零开始构建知识图谱。通过'中国古代文人关系网'实战案例,涵盖软件安装、本体创建、属性定义、实例填充到高级功能应用的全流程,帮助初学者快速掌握知识建模的核心技能。

weixin_26808205的博客 234

深入理解类加载机制

开始正文之前,我想先说一下写这些文章的目的和好处,主要是可以使自己对学习的东西做一个总结,有时候花费很长的时间学了一些东西,理顺了一些思路,可是过几天再回想这些东西的时候还会变得模糊,所有又要花费时间找相关资料,翻看资料。而现在自己做这样一个总结,不但可以对新学习的知识做一个巩固加

2万+

FPGA时序约束:从时钟树到数据路径的深度解析与优化策略

本文深入解析FPGA时序约束的核心技术与优化策略,涵盖时钟树结构分析、时序报告解读和数据路径优化。重点探讨Vivado工具中的时序约束方法,包括时钟定义、异常约束和物理优化,帮助工程师掌握寄存器级时序分析和系统级协同设计,实现高性能FPGA设计。

u5v6w7的博客 651

强化学习:Distributed PPO (DPPO) 学习笔记

DPPO = Distributed + Proximal Policy Optimization Distributed:多个智能体并行训练 Proximal:限制策略更新幅度,确保稳定性 Policy Optimization:基于策略梯度的优化方法 核心思想:多个智能体并行探索环境,共享经验,通过裁剪策略更新确保训练稳定

只是个人学习笔记 1330

JVM 类加载机制详解:从字节码到内存的全过程

本文深入解析JVM类加载机制,从加载到卸载的完整生命周期包含七个阶段:加载、验证、准备、解析、初始化、使用和卸载。重点剖析了类加载过程的五个关键阶段(加载、验证、准备、解析和初始化)的工作原理及实现细节,特别是初始化阶段执行类构造器方法的多线程安全特性。详细介绍了JVM三类核心类加载器(启动类、扩展类和应用程序类加载器)及其双亲委派模型的设计原理,该机制通过层级委派确保类加载的安全性和唯一性。最后,通过自定义类加载器示例,展示了如何实现从特定路径加载加密类文件等特殊需求。理解类加载机制对解决类冲突、反射调用

dom_jun的博客 1165

[Dify实战] 招投标标书智能生成:模板套用 + 风险校验

摘要:本文提出基于Dify构建AI标书生成工作流,解决传统标书撰写中内容重复(80%复用率)、人工修改效率低、风险检查易出错等痛点。方案包含三大核心模块:1)智能生成(基于模板自动填充项目信息);2)风险校验(AI自动检查废标风险点);3)多角色协作。通过拆分标书结构、设置详细Prompt、建立风险检查清单,实现从"人工撰写"到"参数化自动生成+AI审核"的转型,最终输出标准格式文档并支持企业系统集成。典型应用场景下,系统能自动生成技术方案并识别关键风险(如支付安全合

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 826

JVM面试 类加载机制

JVM的类加载机制 一、JVM的运行机制 JVM 是用于运行Java字节码的虚拟机,包括一套字节码指令集,一组程序寄存器,一个虚拟机栈,一个虚拟机堆,一个方法区和一个垃圾回收器。JVM运行在操作系统之上,不与硬件设备直接交互; Java程序具体运行过程: JAVA源文件被编译器编译成字节码文件 JVM将字节码文件编译成相应操作系统的机器码 机器码调用相应操作系统的本地方法库执行相应的方法 二、JVM的类加载机制 1.JVM的类加载阶段 加载 验证 准备 解析 初始化 在类初始化完成后就可以使用该

分享技术,享受生活 7389

SMART200如何实现多次调用子程序带定时器功能

1、西门子200PLC的子程序由于很多限制条件,如果希望建立一个可以多次调用的子程序,那么这个子程序里是不能含有定时器指令的,所以我们只能退而求其次了。建议将沿指令(上升沿、下降沿)放在多次调用子程序的外面。 2、可以提供不同的时基,提供不同时间的定时 3、实现秒定时 5、子程序内部: STL代码: 1、时基信号由外部提供、 可以提供不同的时基信号 2、实现循环定时开关 LD #Start:L0....

RXXW_Dor的博客 1万+

基于YOLOv8深度学习架构的智能农业巡检小车系统—面向农作物与杂草实时精准识别的创新实践

本研究设计并实现了一套基于YOLOv8的智能农业巡检小车系统,解决农田中农作物与杂草的精准识别与追踪问题。系统采用改进YOLOv8-RGCSPELAN-ECA-AFPN模型,融合ECA注意力机制与AFPN多尺度特征融合结构,提升复杂环境下的检测精度。硬件以树莓派4B为核心,集成摄像头、传感器与电机模块,具备避障、循迹与自主导航功能。移动端基于Android部署NCNN推理引擎,实现模型高效移植与实时检测。

Stara-AI的博客 1423

JVM类加载机制深度解析

在深入探讨Java虚拟机(JVM)的运行机制之前,我们首先需要了解JVM的核心知识点之一——加载过程。想象一下,一个复杂的Java应用程序启动时,JVM如何将代码从磁盘上的文件转换成可以在内存中运行的字节码。这个过程看似简单,实则涉及了JVM的多个组件和复杂的逻辑。在当今的软件开发中,内存管理是确保应用程序稳定性和性能的关键。然而,许多开发者往往忽视了JVM的加载过程,这可能导致对JVM内部工作原理的理解不足。

我是Java程序员廖志伟,感谢朋友们的支持! 1126

在 SAP 中修改 Profile 文件中的主机名需要谨慎操作,需需确保所有相关配置保持一致

在SAP系统中修改Profile文件主机名需谨慎操作,主要步骤包括:1)停止相关SAP服务;2)重命名并编辑实例级Profile文件(如ER1_D00_OLDHOST改为ER1_D00_LRPSAP),修改所有含旧主机名的参数;3)可选更新默认Profile文件;4)在Windows系统中调整注册表配置;5)验证一致性后重启服务。关键注意:保持大小写统一、修改前备份文件、集群环境需同步所有节点。通过系统日志确认新主机名生效且无报错。

金牌架构师 1049

死磕JVM:类加载机制

java虚拟机类加载机制

三分之一程序员 1533

[STC32G144K246入门第一步]点亮LED

STC32G144K246是一款高性能32位8051单片机,集成了丰富外设资源,适用于工业控制和复杂算法处理。该芯片支持双模式内核,内置硬件加速器,提供246KB Flash和144KB SRAM存储空间。文章详细介绍了开发环境搭建步骤、寄存器配置方法,并给出了LED驱动示例代码,通过推挽输出控制P42口实现闪烁效果。虽然开发环境相比ARM存在不足,但通过合理配置仍可满足项目需求。该教程为开发者快速上手STC32G144K246提供了实用参考。

sinat_58149788的博客 795

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

JVM类加载机制解析

场景问题:在一个大型分布式系统中,每当启动一个新的服务实例时,系统管理员都会发现服务启动时间较长,且启动过程中资源消耗较大。经过分析,发现这是由于系统中的类加载机制不够高效,导致大量的类需要被重复加载,从而增加了启动时间和资源消耗。为了解决这个问题,我们需要深入了解JVM的类加载机制。知识点重要性:介绍JVM核心知识点之加载:概述的重要性在于,它是理解JVM运行时行为的基础。类加载是JVM执行Java程序的第一步,它决定了哪些类会被加载到JVM中,以及如何加载这些类。

MoneyHacksPro的博客 1111

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

类加载和初始化 —— JVM篇

类加载和初始化 一、Class Cycle(类的加载过程) 类的周期 一个类的完整生命周期如下: 类的加载过程 ​ Class文件在我们硬盘中,需要加载到虚拟机中之后才能运行和使用,那么虚拟机是如何加载这些 Class 文件呢? ​ 系统加载 Class 类型的文件主要三步:加载->连接->初始化。连接过程又可分为三步:验证->准备->解析。 详见:jvm规范5.4 。 1.Loading步骤(加载) 类加载过程的第一步,主要完成下面 3 件事情: 通过全类名获取定义此

YING—country的博客 2520

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

JVM类加载:深入理解Java类加载机制

除了JVM内置的类加载器,我们还可以自定义类加载器来实现一些特殊的加载需求。自定义类加载器需要继承类,并重写findClass方法来实现类的加载逻辑。@Overridetry {在上面的示例中,我们定义了一个类,继承自。我们重写了findClass方法,根据类的名称加载字节码,并使用方法创建Class对象。使用自定义类加载器时,我们可以指定类的路径,然后使用自定义类加载器加载类。

果酱 の 博客 3417

【深入理解JVM】ClassLoader类加载机制

Java程序并不是一个原生的可执行文件,而是由许多独立的类文件组成,每一个文件对应一个Java类。此外,这些类文件并非立即全部装入内存的,而是根据程序需要装入内存。ClassLoader专门负责类文件装入到内存。在class文件中描述的各种信息,最终都需要被加载到虚拟机中之后,才能被运行和使用。虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验,转换,解析和初始化,最终形成可以被虚拟机

lmb55的专栏 2705

【JVM的类加载机制】

本文介绍了JVM的类加载机制,主要包括类加载的时机、过程和初始化阶段。类加载的生命周期分为加载、验证、准备、解析、初始化和卸载7个阶段。主动引用会触发类初始化,而被动引用(如通过子类访问父类静态字段)不会。类加载过程包括获取二进制字节流、验证文件格式和字节码、准备内存空间并设置初始值、解析符号引用等步骤。初始化阶段执行类构造器<clinit>()方法,完成静态变量赋值和静态代码块的执行。文章还分析了常量传播优化等特殊情况对类加载的影响。

qq_75184576的博客 714

jvm深入理解类加载机制

概述 上一篇我们讲解了java文件到class文件的解析过程,但class文件中描述的信息都是死的,像一些类呀,在class文件里保存的只是一个全限定名,我们需要把这些数据加载到虚拟机里面去运行和使用,这一篇将讲解calss文件加载到虚拟机的过程,在内存中真正使用到各种信息。 java虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的java类型,这个过程就被叫做虚拟机的类加载机制。 类加...

清风 1213

【JVM】Java类加载机制详解

【JVM】Java类加载机制详解

blblccc 1677

JVM类加载机制详解以及深入理解双亲委派模型

JVM类的加载机制类加载全过程类的加载器双亲委派机制双亲委派的优点全盘负责委托机制自定义加载器打破双亲委派机制 类加载全过程 经过验证,解析等一系列的操作变成类元信息放到内存中 加载:在磁盘上找到对应的类,通过io读取字节码文件,使用到类的时候才会加载到内存区域中,在加载阶段会在内存中生成类的class对象,作为方法区这个类的各种数据的访问接口 验证:验证字节码文件的正确性 准备:给类的静态变量做一些初始值的赋值,如int赋值0,对象赋值为null。 解析:讲符号引用替换为直接引用,改阶段会 初始化:

飞翔的蜗牛的博客 1332
上一篇: Java 的跨平台性:实现“一次编写,到处运行”的秘密
下一篇: Java 对象的生命周期:从创建到回收
.29.
.29. 2022 社区之星年度评选TOP 30 2022 社区之星年度评选TOP 30
博客等级 码龄5年 1万+粉丝 203原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

.29.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值