java中类的加载过程及各个阶段与运行时数据区中堆和方法区存储内容
java中类的加载过程
Java 类的加载是 JVM 将 字节码文件(.class 文件)加载到内存并最终转化为运行时数据的过程。它分为以下 五个主要阶段:加载、验证、准备、解析、初始化,每个阶段都有对应的内存位置存储相关信息。以下是类加载过程的详细描述,以及各阶段存储的信息和存储位置。
1. 加载(Loading)
过程描述:
- JVM 根据类的全限定名,通过类加载器(ClassLoader)找到字节码文件,并将其加载到内存中。
- 加载过程的核心任务是生成一个
Class对象,表示类的元信息。
主要内容存储:
- 类的字节码:
- 从文件系统、JAR 包、网络等位置加载
.class文件。
- 从文件系统、JAR 包、网络等位置加载
Class对象:- JVM 在方法区中为类生成一个运行时数据结构(元数据表),并在堆中创建一个对应的
java.lang.Class对象,以供程序使用。
- JVM 在方法区中为类生成一个运行时数据结构(元数据表),并在堆中创建一个对应的
存储位置:
- 方法区(由元空间实现):
- 存储类的结构和元信息。
- 堆:
- 存储生成的
Class对象。
- 存储生成的
2. 验证(Verification)
过程描述:
- JVM 验证字节码文件的正确性,确保其符合 JVM 的安全规范,避免恶意代码破坏虚拟机。
验证内容:
- 文件格式验证:
- 检查
.class文件是否符合 Class 文件格式规范(例如魔数0xCAFEBABE)。
- 检查
- 元数据验证:
- 验证类的元信息是否符合要求。
- 是否有父类(除
java.lang.Object外)。 - 接口、字段、方法是否符合规范。
- 是否有父类(除
- 验证类的元信息是否符合要求。
- 字节码验证:
- 检查方法体的字节码指令是否合法。
- 符号引用验证:
- 验证符号引用是否可以解析为实际的字段、方法或类。
存储位置:
- 方法区:
- 在验证过程中,类元数据结构可能会被进一步填充或更新。
- 运行时常量池:
- 符号引用的验证涉及运行时常量池中内容的检查。
3. 准备(Preparation)
过程描述:
- 为类的 静态变量 分配内存,并设置默认初始值(零值)。
- 不执行静态变量的赋值操作(赋值将在初始化阶段完成)。
处理内容:
-
静态变量:
-
例如:
class Example {static int a = 10; // 此阶段 a 的值为 0static final int b = 20; // b 会直接在常量池中赋值为 20 } -
静态变量
a被分配内存并初始化为默认值0,b(final修饰的常量)直接存储在运行时常量池中。
-
存储位置:
- 堆:
- 静态变量引用的对象存储在堆中。
- 方法区:
- 静态变量的初始值记录在方法区。
4. 解析(Resolution)
过程描述:
- 将运行时常量池中的 符号引用 转换为 直接引用。
- 符号引用是字面上的逻辑引用(例如类名、字段名),而直接引用是具体的内存地址或偏移量。
解析内容:
- 类或接口解析:
- 将符号引用的类名解析为方法区中对应的类元数据结构。
- 字段解析:
- 将字段名解析为具体字段的内存地址或偏移量。
- 方法解析:
- 将方法名和描述符解析为具体方法的字节码指针。
存储位置:
- 方法区:
- 符号引用存储在运行时常量池中,解析后的直接引用存储在类的元数据结构中。
- 堆:
- 解析的对象或方法指针可能引用堆内存中的对象实例。
5. 初始化(Initialization)
过程描述:
- 执行类的 () 方法,完成静态变量的赋值和静态代码块的执行。
<clinit>()方法是由编译器自动生成的,包含所有静态变量的显式赋值语句和静态代码块。
处理内容:
-
静态变量赋值:
-
静态变量被赋予程序中指定的初始值。
static int a = 10; // 此阶段 a 的值被设为 10
-
-
静态代码块:
-
执行静态代码块中的逻辑。
static {System.out.println("Class initialized!"); }
-
存储位置:
- 方法区:
- 静态变量的值更新存储在方法区。
- 堆:
- 静态变量引用的对象存储在堆中。
类加载过程中数据存储的总结
| 阶段 | 存储内容 | 存储位置 |
|---|---|---|
| 加载 | 字节码文件、类元数据(类名、字段、方法描述等)、生成 Class 对象。 | 方法区(元空间)存储类元数据,堆存储 Class 对象。 |
| 验证 | 验证 .class 文件和符号引用的合法性。 | 方法区(更新类元数据和常量池)。 |
| 准备 | 分配静态变量的内存,初始化默认值。 | 方法区存储变量描述,堆存储静态变量的实际值。 |
| 解析 | 符号引用解析为直接引用(类、字段、方法的实际地址)。 | 方法区(解析常量池符号引用)。 |
| 初始化 | 执行 <clinit>() 方法,完成静态变量赋值和静态代码块执行。 | 方法区存储最终结果,堆存储静态引用的对象。 |
补充:类加载的触发时机
类的加载可能在以下时机被触发:
- 主动引用:
- 创建类的实例(如
new操作符)。 - 访问类的静态字段或调用静态方法。
- 使用反射操作类。
- 创建类的实例(如
- 被动引用:
- 子类访问父类的静态字段时,只触发父类加载。
- 定义数组类型不会触发类加载。
类加载过程是 JVM 高效运行的基础,精确的存储分配和管理确保了类的正确运行和内存的优化使用。
相关文章:
java中类的加载过程及各个阶段与运行时数据区中堆和方法区存储内容
java中类的加载过程 Java 类的加载是 JVM 将 字节码文件(.class 文件)加载到内存并最终转化为运行时数据的过程。它分为以下 五个主要阶段:加载、验证、准备、解析、初始化,每个阶段都有对应的内存位置存储相关信息。以下是类加载…...
渗透测试--Web基础漏洞利用技巧
渗透测试--Web基础漏洞利用技巧 本文章写了Web基础漏洞中一些不那么常见的利用技巧,而不谈及漏洞的原理以及常见用法。 SQL 俺是SQLmap党,哈哈,所以这块就不多讲了。详情可见文章《渗透测试--SQLmap_渗透测试sqlmap-CSDN博客》 XXE XXE组成…...
SpringBoot下载文件的几种方式
小文件:直接将文件一次性读取到内存中,文件大可能会导致OOM GetMapping("/download1")public void download1(HttpServletResponse response) throws IOException {// 指定要下载的文件File file new File("C:\\Users\\syd\\Desktop\\do…...
教程:从pycharm基于anaconda构建机器学习环境并运行第一个 Python 文件
1. 安装 PyCharm 访问 PyCharm 官方网站:https://www.jetbrains.com/pycharm/。下载社区版(免费)或专业版(收费,提供更多功能)。按照操作系统的安装指导安装 PyCharm。安装后打开 PyCharm,并根…...
我用Ai学Android Jetpack Compose之Button
答案来自 通义千问,代码同样需要到Android Studio里实践,才能学会。完整工程代码见文末。 我要学Button,麻烦介绍一下 当然可以!Button 是 Jetpack Compose 中用于创建可点击按钮的 Composable 函数。它提供了丰富的配置选项来定…...
修改secure-file-priv参数-mysql5.7.26限制不允许导入或导出的解决方法
文章目录 前言secure_file_priv参数说明修改secure_file_priv参数的步骤 前言 本人是在sql注入的文件上传拿web shel 时所用到的写入文件权限遇到文件上传不成功的问题,记住修改后,重启mysql才生效,最后可以查看验证一下。 secure_file_priv…...
C# 设计模式(结构型模式):适配器模式
C# 设计模式(结构型模式):适配器模式 在软件开发中,我们经常会遇到需要将不同接口的组件结合在一起的情况。此时,适配器模式(Adapter Pattern)就派上了用场。它属于结构型设计模式,…...
Spring Cloud微服务多模块架构:父子工程搭建实践
一、前言 在现代微服务架构中,Spring Cloud 提供了一整套工具和技术栈来简化分布式系统的开发。为了更好地组织和管理复杂的微服务项目,使用 Maven 多模块(父子工程) 是一种高效的方法。 父子工程 是 Maven 中的一种项目结构…...
SkinnedMeshRenderer相关知识
SkinnedMeshRenderer和MeshRenderer unity中SkinnedMeshRenderer是CPU去更改顶点位置的。 而当使用MeshRenderer时,可以靠GPU来进行蒙皮(即更改顶点位置)。 SkinnedMeshRenderer是多线程处理的,在小程序游戏中,只支持…...
前端学习DAY30(水平)
子元素是在父元素的内容区中排列的,如果子元素的大小超过了父元素,则子元素会从 父元素中溢出,使用overflow属性设置父元素如何处理溢出的子元素 可选值:visible 默认值,子元素会从父元素中溢出,在父元素外…...
Spring boot 项目 Spring 注入 代理 并支持 代理对象使用 @Autowired 去调用其他服务
文章目录 类定义与依赖注入方法解析createCglibProxy注意事项setApplicationContext 方法createCglibProxy 方法 类定义与依赖注入 Service: 标识这是一个 Spring 管理的服务类。ApplicationContextAware: 实现该接口允许你在类中获取 ApplicationContext 对象,从而…...
Colyseus 与 HTTP API 的集成
Colyseus 与 HTTP API 的集成 在使用 Colyseus 开发实时多人应用时,通常需要与传统的 HTTP API 集成,例如用户身份验证、存储游戏数据、获取排行榜等。以下是 Colyseus 与 HTTP API 集成的详细介绍: 1. Colyseus 的基本架构 Colyseus 是一个…...
基于服务器部署的综合视频安防系统的智慧快消开源了。
智慧快消视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。国产化人工智能“…...
SpringBoot原理分析-1
SpringBoot原理分析 作为一个javaer,和boot打交道是很常见的吧。熟悉boot的人都会知道,启动一个springboot应用,就是用鼠标点一下启动main方法,然后等着就行了。我们来看看这个main里面。 SpringBootApplication public class E…...
HCIA-Access V2.5_7_5_XG(S)- GPON网络演进为XG(S)-PON网络
目前由于10 GPON ONU数量并没有得到大规模爆发,所以直接新建ODN网络成本相对较高,所以可以采用复用ODN的方案。 XG(S)-PON可以与GPON共享ODN 前面也介绍过GPON和10G GPON使用的波长,我们来回顾一下,在GPON网络中上行采用1310纳米波长,下行采用1490纳米的波长,而10G GPON…...
GPU算力平台的应用之任意门:任意穿搭匹配模型的应用教程
大家好,今天给大家介绍一下:GPU算力平台的应用之任意门:任意穿搭匹配模型的应用教程。 文章目录 一、GPU算力平台概述人工智能智能发展为什么需要GPU算力平台 二、注册与登录账号注册流程 三、平台的应用之Anydoor应用启动器选择Anydoor的应用场景Anydoo…...
如何利用人工智能算法优化知识分类和标签?
如何利用人工智能算法优化知识分类和标签? 聚类算法 原理与应用: 聚类算法是一种无监督学习算法,它可以根据数据的相似性将知识内容自动划分成不同的类别。例如,在文档知识库中,通过对文档内容的词向量表示应用 K -…...
Windows 11 系统中npm-cache优化
在 Windows 11 系统中,C:\Users\K\AppData\Local\npm-cache 文件夹是 npm(Node Package Manager) 用于缓存已下载的包的目录。缓存的存在可以加快包的安装速度,因为当再次安装相同的包时,npm 可以直接从缓存中获取&…...
Flink使用
Window下启动支持 下载或复制老版本的放在bin目录下即可; flink.bat echo off setlocalSET bin%~dp0 SET FLINK_HOME%bin%.. SET FLINK_LIB_DIR%FLINK_HOME%\lib SET FLINK_PLUGINS_DIR%FLINK_HOME%\pluginsSET JVM_ARGS-Xmx512mSET FLINK_JM_CLASSPATH%FLINK_LI…...
简易屏幕共享工具-基于WebSocket
前面写了两个简单的屏幕共享工具,不过那只是为了验证通过截屏的方式是否可行,因为通常手动截屏的频率很低,而对于视频来说它的帧率要求就很高了,至少要一秒30帧率左右。所以,经过实际的截屏工具验证,我了解…...
Python脚本驱动:AutoCAD Plant 3D中槽式垂直三通参数化建模实战
1. 为什么需要参数化建模槽式垂直三通? 在管道工程设计领域,槽式垂直三通是最常见的管件之一。传统手动建模方式需要反复绘制草图、拉伸实体、布尔运算,一个简单的三通模型可能要花费设计师半小时。当遇到非标尺寸或批量修改时,这…...
【SITS2026官方性能白皮书精要】:AI模型推理延迟降低47%的7个硬核优化路径
SITS2026分享:AI性能优化建议 第一章:SITS2026白皮书核心结论与基准测试全景 2026奇点智能技术大会(https://ml-summit.org) 白皮书核心主张 SITS2026白皮书首次确立“语义-时序-空间”三重对齐(STS Alignment)为新一代智能系统…...
uni-app集成优博讯DT50U:串口与广播模式下的硬件功能开发实践
1. 优博讯DT50U与uni-app开发基础 优博讯DT50U是一款工业级PDA设备,集成了RFID读写、条码扫描等实用功能。对于需要在移动端实现硬件集成的开发者来说,通过uni-app框架调用这些硬件功能是个不错的选择。uni-app作为跨平台开发框架,可以一套代…...
【20年IDE架构师亲测】:长代码生成准确率从63%跃升至91.7%的6个不可跳过的工程化卡点
第一章:智能代码生成在长代码中的挑战 2026奇点智能技术大会(https://ml-summit.org) 当智能代码生成模型面对超过千行的模块化系统(如微服务入口层、编译器前端或分布式事务协调器)时,其输出质量常出现显著衰减。这种衰减并非源…...
【卷卷漫谈】DeepSeek V4 背后那条没退路的山路
结论:DeepSeek V4 还有不到两周发布,但它背后那条路——从 CUDA 转向华为昇腾 CANN 框架——才是这篇文章真正想说的。这是一个关于"代价"的故事。今天是 2026 年 4 月 17 日。DeepSeek V4 还没发布。从去年年底开始,"V4 下周…...
告别Source Insight卡顿!用Vim + Ctags + Cscope打造你的Linux代码阅读神器(附.vimrc配置)
从零构建极速代码导航环境:VimCtagsCscope实战指南 第一次接触大型C项目时,我像大多数新手一样选择了图形化IDE。直到某天在远程服务器上,看着Source Insight索引文件时逐渐变红的进度条和最终崩溃的X11会话,才意识到该寻找更高效…...
FastDDS安装与配置全指南:零基础入门到实战(含常见问题解决方案)
FastDDS安装与配置全指南:零基础入门到实战 第一次接触FastDDS时,我被它强大的实时通信能力和灵活的配置选项所吸引,但随之而来的是一连串的编译错误和配置困惑。记得当时为了调试一个简单的发布订阅示例,整整花了两天时间排查环…...
终极免费环世界MOD管理器:3分钟解决加载顺序混乱的完整指南
终极免费环世界MOD管理器:3分钟解决加载顺序混乱的完整指南 【免费下载链接】RimSort RimSort is an open source mod manager for the video game RimWorld. There is support for Linux, Mac, and Windows, built from the ground up to be a reliable, community…...
3步搞定缠论分析:ChanlunX插件让技术分析变简单
3步搞定缠论分析:ChanlunX插件让技术分析变简单 【免费下载链接】ChanlunX 缠中说禅炒股缠论可视化插件 项目地址: https://gitcode.com/gh_mirrors/ch/ChanlunX 还在为复杂的缠论理论头疼吗?ChanlunX缠论可视化插件将复杂的缠论分析变得直观易懂…...
生成式AI缓存预热机制:基于请求分布预测+动态热度衰减模型的实时预热引擎(已落地金融大模型平台)
第一章:生成式AI应用缓存预热机制 2026奇点智能技术大会(https://ml-summit.org) 在生成式AI服务高并发、低延迟的生产场景中,冷启动导致的首请求延迟(如LLM推理响应超2s)会显著劣化用户体验。缓存预热机制通过在服务上线前主动加…...
