类加载生命周期与内存区域详解

Java 类加载的生命周期包括加载、验证、准备、解析、初始化五个阶段,每个阶段在内存中的存储区域和赋值机制各有不同。以下是详细解析:

一、类加载生命周期阶段

1. 加载(Loading)
  • 内存区域
    • 方法区:存储类的元数据(如类结构、字段、方法信息)
    • :生成对应的 java.lang.Class 对象
  • 赋值机制
    • 通过类加载器读取字节码文件(如 .class
    • 将字节码转换为方法区的二进制数据
    • 在堆中创建 Class 对象,作为方法区数据的访问入口
2. 验证(Verification)
  • 内存区域
    • 方法区:验证字节码的合法性
  • 赋值机制
    • 不涉及新的赋值,仅校验已加载数据的合规性
    • 例如:检查字节码格式、符号引用合法性、语义校验等
3. 准备(Preparation)
  • 内存区域
    • 方法区:为静态变量分配内存
  • 赋值机制
    • 为静态变量(static)分配内存并设置初始值
    • 初始值通常为数据类型的默认值(如 0nullfalse
    • 示例
      public static int value = 123; // 准备阶段赋值为 0,初始化阶段才赋值为 123
      
4. 解析(Resolution)
  • 内存区域
    • 方法区:将符号引用转换为直接引用
  • 赋值机制
    • 修改方法区中的符号引用,替换为直接引用(如内存地址、方法表索引)
    • 例如:将 com.example.MyClass 符号引用转换为对应的 Class 对象指针
5. 初始化(Initialization)
  • 内存区域
    • 方法区:执行类构造器 <clinit>()
    • 堆/栈:根据初始化逻辑为静态变量赋实际值
  • 赋值机制
    • 执行静态变量的显式赋值语句和静态代码块
    • 调用类构造器 <clinit>() 方法
    • 示例
      public static int value = 123; // 初始化阶段赋值为 123
      public static final int CONST = 456; // 编译期常量,准备阶段直接赋值为 456
      

二、各阶段内存分配与赋值示例

1. 代码示例
public class ClassLoadingExample {// 静态变量(准备阶段赋默认值 0,初始化阶段赋实际值 100)public static int staticVar = 100;// 静态常量(编译期常量,准备阶段直接赋实际值 200)public static final int CONSTANT = 200;// 静态代码块(初始化阶段执行)static {System.out.println("静态代码块执行");}// 实例变量(在对象创建时分配到堆中)private int instanceVar = 300;
}
2. 内存分配时序
阶段内存区域变量状态
加载方法区(元数据)
堆(Class 对象)
类结构信息被加载
ClassLoadingExample.class 对象创建
准备方法区staticVar = 0
CONSTANT = 200(编译期常量直接赋值)
初始化方法区(执行 <clinit>()staticVar = 100
静态代码块执行
实例化堆(对象实例)instanceVar = 300(每次创建对象时分配)

三、特殊情况说明

1. 静态常量(static final
  • 编译期常量:在编译时确定值,准备阶段直接赋实际值
    public static final int CONST = 123; // 准备阶段直接赋值为 123
    
  • 运行时常量:在运行时确定值,初始化阶段赋值
    public static final int RUNTIME_CONST = new Random().nextInt(); // 初始化阶段赋值
    
2. 类构造器 <clinit>()
  • 由编译器自动收集静态变量赋值语句和静态代码块生成
  • 线程安全,JVM 保证只执行一次
  • 示例
    static {a = 1; // 先赋值b = 2; // 后赋值
    }
    static int a;
    static int b;
    
    编译后的 <clinit>() 顺序:
    a = 1;
    b = 2;
    a = 0; // 变量定义覆盖赋值,最终 a=0, b=2
    

四、内存区域详细说明

1. 方法区(Method Area)
  • 存储内容
    • 类的结构信息(如字段、方法、接口定义)
    • 运行时常量池(包含符号引用和直接引用)
    • 静态变量
    • 类的字节码
  • JDK 8+ 变化
    • 方法区由 元空间(Metaspace) 实现,使用本地内存而非堆内存
2. 堆(Heap)
  • 存储内容
    • 类的实例对象(如 new ClassLoadingExample()
    • 数组
    • Class 对象(作为方法区元数据的访问入口)
  • 特点
    • 线程共享
    • 垃圾回收的主要区域
3. 栈(Stack)
  • 存储内容
    • 局部变量
    • 方法调用帧(包含方法参数、返回值等)
  • 与类加载的关系
    • 方法调用时会创建栈帧
    • 局部变量在栈帧中分配内存

五、总结

阶段内存区域核心操作示例赋值
加载方法区、堆读取字节码,创建 Class 对象
验证方法区校验字节码合法性
准备方法区为静态变量分配内存,赋默认值static int a;a = 0
解析方法区将符号引用转换为直接引用修改常量池中的引用类型
初始化方法区、堆/栈执行 <clinit>(),赋实际值static int a = 123;a = 123

理解类加载生命周期和内存分配机制,有助于深入掌握 Java 的运行原理,避免因静态变量初始化顺序等问题导致的错误。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/912636.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/912636.shtml
英文地址,请注明出处:http://en.pswp.cn/news/912636.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

正交视图三维重建2 笔记 2d线到3d线2 先生成3d线然后判断3d线在不在

应该先连线再判断线在不在 if(fx1tx1&&tx1tx2){ const A[fx1, fy1, ty1];const Ahat[fx1, fy1, ty2];drawlines(A[0], A[1], A[2], Ahat[0], Ahat[1], Ahat[2], lineId, type,2);}if(fx2tx1&&tx1tx2){ const B[fx2, fy2, ty1];const Bhat[fx2, fy2, ty2];drawl…

Hibernate对象生命周期全解析

Hibernate对象生命周期详解 Hibernate作为Java领域主流的ORM框架,其核心机制之一就是对持久化对象生命周期的管理。理解Hibernate对象生命周期对于正确使用Hibernate进行数据持久化操作至关重要。Hibernate将对象分为三种主要状态:瞬时态(Transient)、持久态(Persistent)和游…

MCP 协议使用核心讲解

&#x1f4c4; MCP 协议使用核心讲解 ✅ MCP 协议的核心在于以下几个方面 一、MCP 请求结构&#xff08;MCPRequest&#xff09; {"messages": [{"role": "user","content": "帮我查询一下上海的天气"}],"tools"…

云计算中的几何方法:曲面变形的可视化与动画-AI云计算数值分析和代码验证

着重强调微分方程底层的几何和代数结构&#xff0c;以进行更深入的分析和求解方法。开发结构保持的数值方法&#xff0c;以在计算中保持定性特征。统一符号和数值方法&#xff0c;实现有效的数学建模。利用几何解释&#xff08;如双曲几何&#xff09;求解经典微分方程。利用计…

OpenCV篇——项目(一)OCR识别读取银行卡号码

目录 信用卡数字识别系统&#xff1a;前言与代码解析 前言 项目代码 ​​​​​​结果演示 代码模块解析 1. 参数解析模块 2. 轮廓排序函数 3. 图像预处理模块 4. 输入图像处理流程 5. 卡号区域定位 6. 数字识别与输出 系统优势 信用卡数字识别系统&#xff1a;前言…

Adobe AI高效设计秘籍与创新思维进阶

开篇&#xff1a;十年设计征途&#xff0c;Adobe赋能创意飞翔 作为一名在设计领域耕耘十年的旅居职业设计师&#xff0c;我得益于英国帕维斯经济与音乐学院&#xff08;Parvis School of Economics and Music&#xff09;提供的Adobe正版教育订阅&#xff0c;得以持续探索技术…

vc formal实例

命令&#xff1a; module load gui 方式启动命令&#xff0c; 看一下cc_pinmux.tcl 里面有什么&#xff1a; 工具feature 的设置&#xff0c;不太懂 对特定模块做blackbox, library file, 一般是工具无法识别的模块&#xff0c;例如 IO lib,memory lib,analog lib, 内部有 …

JavaScript取值get的json/url/普通对象参考

dstore.on(datachanged,function(dstore){ for(i0;i<dstore.getCount();i){ var a dstore.getAt(i); var imp_infoa.get(imp_info); 上面这段JS代码&#xff0c;imp_info取到的是一长串KEY和VALUE组成的内容&#xff0c;我怎样可以准确获取其中一…

【C++】侦测按键事件

侦测按键事件可以用C的conio.h头文件&#xff0c;用到的函数&#xff1a; _CRTIMP int __cdecl _getch(void); 输入以下代码&#xff1a; #include <iostream> #include <conio.h> using namespace std;int main() {char key;while (true) {cout << "…

Coremail受邀亮相华为开发者大会

6月20-22日&#xff0c;为期三天的HDC.2025华为开发者大会在东莞举行&#xff0c;全球超过1.2万名开发者汇聚现场&#xff0c;聚焦鸿蒙生态、AI技术及产业合作。Coremail作为鸿蒙生态的核心伙伴和深度参与者受邀出席&#xff0c;并获得“智慧办公最佳产品合作伙伴”奖项。 HDC.…

视频断点续播全栈实现:基于HTML5前端与Spring Boot后端

文章目录 视频断点续播功能实现方案核心思路前端实现HTML结构JavaScript实现Spring Boot后端实现1.依赖配置(pom.xml)2.实体类3.存储库接口4.服务层5. 控制器实现要点视频断点续播功能构思图流程说明用户交互:前端核心功能:后端处理:数据存储:🌐 我的个人网站:乐乐主题创…

华为设备 QoS 流分类与流标记深度解析及实验脚本

一、引言 在复杂网络环境中&#xff0c;不同业务对网络质量需求各异。语音通话要求低时延、视频直播依赖高带宽、普通文件传输对丢包容忍度相对较高 。QoS&#xff08;Quality of Service&#xff0c;服务质量&#xff09;技术通过流分类、流标记等手段&#xff0c;为不同业务…

[论文阅读] 人工智能 + 软件工程 | 从软件工程视角看大语言模型:挑战与未来之路

从软件工程视角看大语言模型&#xff1a;挑战与未来之路 论文标题&#xff1a;Software Engineering for Large Language Models: Research Status, Challenges and the Road Ahead arXiv:2506.23762 Software Engineering for Large Language Models: Research Status, Chall…

【Docker基础】Docker容器管理:docker rm及其参数详解

目录 1 Docker容器生命周期概述 2 docker rm命令基础 2.1 命令基本语法 2.2 命令功能说明 2.3 基本使用示例 3 docker rm参数详解 3.1 -f, --force 3.2 -v, --volumes 3.3 -l, --link 3.4 --time 4 docker rm高级用法 4.1 批量删除容器 4.1.1 删除所有已停止的容器…

鸿蒙进阶——Mindspore Lite AI框架源码解读之模型加载详解(五)

文章大纲 引言一、LiteSession::CompileGraph(Model *model)二、LiteSession::CompileGraph(Model *model) 核心流程1、MindirModel::ConvertTensors1.1、遍历并执行MindirModel::ConvertTensor1.1.1、MindirModel::LoadTensorData 三、LiteSession::InitGraphInputTensors(mod…

WireShark网络取证分析第一集到第五集和dvwa靶场环境分析漏洞

文章目录 一、WireShark网络取证是什么?二、WireShark网络取证1.WireShark网络取证分析第一集Ann的即时通讯好友叫什么名字?在捕获的即时通讯对话中第一条评论是什么?Ann传输的文件叫什么名字?您想提取的文件的魔数是什么(前四个字节)?文件的MD5sum是多少?什么是秘密配方…

【51单片机按下按键1,8位共阴极数码管输出2022-606。按下按键2,8位共阴极数码管输出606-1132。】2022-6-10

缘由单片极的共阴极数码管按下按键1和按键2输出的内容-编程语言-CSDN问答 #include "REG52.h" unsigned char code smgduan[]{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0,64}; //共阴0~F消隐减号 unsigned char Js0, miao…

HDMI转12G- SDI GS12170+GS12281-富利威方案设计及技术支持

GS12281 是一款低功耗、多速率、重定时电缆驱动器&#xff0c;支持高达 12G UHD-SDI 的速率。它设计用于接收 100Ω 差分输入信号&#xff0c;自动从数字视频信号中恢复嵌入式时钟并重新定时输入数据&#xff0c;并通过 75Ω 同轴电缆传输重新定时的信号。 100Ω 走线输入支持…

自然语言处理:NLP入门

本文目录&#xff1a; 一、概念二、发展史三、核心任务和技术特别分享1&#xff1a;当前挑战和前沿方向特别分享2&#xff1a;大神名言启示 前言&#xff1a;从本章开始讲解自然语言处理&#xff08;NLP&#xff09;&#xff0c;今天先入个门~ 一、概念 自然语言处理&#xff…

用Fiddler中文版抓包工具掌控微服务架构中的接口调试:联合Postman与Charles的高效实践

随着微服务架构在项目中的广泛应用&#xff0c;系统被拆分成多个独立的服务&#xff0c;彼此通过API通信。虽然架构带来了灵活性&#xff0c;但也大幅增加了接口数量和调用链复杂度&#xff1a;一次用户操作可能触发跨多个服务的调用&#xff0c;导致前端调试难度飙升。要精准排…