java中类的加载过程及各个阶段与运行时数据区中堆和方法区存储内容

java中类的加载过程

Java 类的加载是 JVM 将 字节码文件.class 文件)加载到内存并最终转化为运行时数据的过程。它分为以下 五个主要阶段加载、验证、准备、解析、初始化,每个阶段都有对应的内存位置存储相关信息。以下是类加载过程的详细描述,以及各阶段存储的信息和存储位置。


1. 加载(Loading)

过程描述:

  • JVM 根据类的全限定名,通过类加载器(ClassLoader)找到字节码文件,并将其加载到内存中。
  • 加载过程的核心任务是生成一个 Class 对象,表示类的元信息。

主要内容存储:

  • 类的字节码:
    • 从文件系统、JAR 包、网络等位置加载 .class 文件。
  • Class 对象:
    • JVM 在方法区中为类生成一个运行时数据结构(元数据表),并在堆中创建一个对应的 java.lang.Class 对象,以供程序使用。

存储位置:

  • 方法区(由元空间实现):
    • 存储类的结构和元信息。
  • 堆:
    • 存储生成的 Class 对象。

2. 验证(Verification)

过程描述:

  • JVM 验证字节码文件的正确性,确保其符合 JVM 的安全规范,避免恶意代码破坏虚拟机。

验证内容:

  1. 文件格式验证:
    • 检查 .class 文件是否符合 Class 文件格式规范(例如魔数 0xCAFEBABE)。
  2. 元数据验证:
    • 验证类的元信息是否符合要求。
      • 是否有父类(除 java.lang.Object 外)。
      • 接口、字段、方法是否符合规范。
  3. 字节码验证:
    • 检查方法体的字节码指令是否合法。
  4. 符号引用验证:
    • 验证符号引用是否可以解析为实际的字段、方法或类。

存储位置:

  • 方法区:
    • 在验证过程中,类元数据结构可能会被进一步填充或更新。
  • 运行时常量池:
    • 符号引用的验证涉及运行时常量池中内容的检查。

3. 准备(Preparation)

过程描述:

  • 为类的 静态变量 分配内存,并设置默认初始值(零值)。
  • 不执行静态变量的赋值操作(赋值将在初始化阶段完成)。

处理内容:

  • 静态变量:

    • 例如:

      class Example {
          static int a = 10; // 此阶段 a 的值为 0
          static final int b = 20; // b 会直接在常量池中赋值为 20
      }
      
    • 静态变量 a 被分配内存并初始化为默认值 0bfinal 修饰的常量)直接存储在运行时常量池中。

存储位置:

  • 堆:
    • 静态变量引用的对象存储在堆中。
  • 方法区:
    • 静态变量的初始值记录在方法区。

4. 解析(Resolution)

过程描述:

  • 将运行时常量池中的 符号引用 转换为 直接引用
  • 符号引用是字面上的逻辑引用(例如类名、字段名),而直接引用是具体的内存地址或偏移量。

解析内容:

  1. 类或接口解析:
    • 将符号引用的类名解析为方法区中对应的类元数据结构。
  2. 字段解析:
    • 将字段名解析为具体字段的内存地址或偏移量。
  3. 方法解析:
    • 将方法名和描述符解析为具体方法的字节码指针。

存储位置:

  • 方法区:
    • 符号引用存储在运行时常量池中,解析后的直接引用存储在类的元数据结构中。
  • 堆:
    • 解析的对象或方法指针可能引用堆内存中的对象实例。

5. 初始化(Initialization)

过程描述:

  • 执行类的 () 方法,完成静态变量的赋值和静态代码块的执行。
  • <clinit>() 方法是由编译器自动生成的,包含所有静态变量的显式赋值语句和静态代码块。

处理内容:

  1. 静态变量赋值:

    • 静态变量被赋予程序中指定的初始值。

      static int a = 10; // 此阶段 a 的值被设为 10
      
  2. 静态代码块:

    • 执行静态代码块中的逻辑。

      static {
          System.out.println("Class initialized!");
      }
      

存储位置:

  • 方法区:
    • 静态变量的值更新存储在方法区。
  • 堆:
    • 静态变量引用的对象存储在堆中。

类加载过程中数据存储的总结

阶段存储内容存储位置
加载字节码文件、类元数据(类名、字段、方法描述等)、生成 Class 对象。方法区(元空间)存储类元数据,堆存储 Class 对象。
验证验证 .class 文件和符号引用的合法性。方法区(更新类元数据和常量池)。
准备分配静态变量的内存,初始化默认值。方法区存储变量描述,堆存储静态变量的实际值。
解析符号引用解析为直接引用(类、字段、方法的实际地址)。方法区(解析常量池符号引用)。
初始化执行 <clinit>() 方法,完成静态变量赋值和静态代码块执行。方法区存储最终结果,堆存储静态引用的对象。

补充:类加载的触发时机

类的加载可能在以下时机被触发:

  1. 主动引用:
    • 创建类的实例(如 new 操作符)。
    • 访问类的静态字段或调用静态方法。
    • 使用反射操作类。
  2. 被动引用:
    • 子类访问父类的静态字段时,只触发父类加载。
    • 定义数组类型不会触发类加载。

类加载过程是 JVM 高效运行的基础,精确的存储分配和管理确保了类的正确运行和内存的优化使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/948892.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JVM对象内存分配

1 栈上分配 栈空间随着方法执行完毕而回收通过栈上分配对象内存空间的方式&#xff0c;减少对堆空间的使用&#xff0c;从而减少gc的压力&#xff0c;提升程序性能 逃逸分析&#xff1a;分析对象的作用域&#xff0c;判断对象所需内存是否可以在栈上分配当对象没有被外部方法或…

性能测试04|JMeter:连接数据库、逻辑控制器、定时器

目录 一、连接数据库 1、使用场景 2、直连数据库的关键配置 3、案例 ​编辑 二、逻辑控制器 1、if控制器 2、循环控制器 3、ForEach控制器 三、定时器 1、同步定时器 2、常数吞吐量定时器&#xff08;用的少&#xff0c;了解即可&#xff09; 3、固定定时器 一、连…

国内Ubuntu环境Docker部署 SenseVoice

国内Ubuntu环境Docker部署 SenseVoice 趁热搞定了 docker 部署 SenseVoice。在这里记录一下相关的文件。 SenseVoice是一个大模型语音识别库, 支持多种语言识别&#xff0c;速度快&#xff0c;准确率高&#xff0c;详细介绍请参考GitHub官网&#xff1a; https://github.com/Fu…

1.2.1-2部分数据结构的说明02_链表

&#xff08;1&#xff09;链表数据结构&#xff1a; 概念&#xff1a; 将列表中相互连接的节点不连续的存储在内存中。与数据不同&#xff0c;我们无法再恒定时间内访问任何元组&#xff0c;如果遍历所有则花费时间与元素总数n成正比。插入和删除1个元素的时间复杂度都是O(n…

什么是.net framework,什么是.net core,什么是.net5~8,版本对应关系

我不知道有多少人和我一样&#xff0c;没学习过.netCore&#xff0c;想要学习&#xff0c;但是版本号太多就蒙了&#xff0c;不知道学什么了&#xff0c;这里解释下各个版本的关系 我们一般开始学习微软的时候&#xff0c;都是开始学习的.netframework&#xff0c;常用的就是4…

网站常用功能模块-鉴权

一&#xff1a;JWT是什么&#xff1f; 常用鉴权方式有很多种&#xff0c;今天主要介绍基于token的鉴权方式JWT&#xff08;Json JSON Web Token&#xff09;。因为这种方式实现起来方便快捷。整体实现逻辑如下 第一次登陆时&#xff0c;前端携带账号和密码请求登录接口。服务…

S32K144 UDSdoCAN 升级刷写实现笔记

文章目录 1. 摘要2. 开发环境搭建2.1 开发板2.2 IDE 安装2.3 更新扩展包2.4 烧录仿真测试2.4.1 新建工程2.4.2 导入已有工程2.4.3 编译工程2.4.4 硬件连接2.4.5 Debug2.4.6 添加 .c .h 文件2.5 串口配置2.5.1 时钟2.5.2 GPIO2.5.3 定时器2.5.4 uart 工程2.5.5 烧录验证3. 升级原…

《信息收集是这样吗?》

信息收集 前置&#xff1a;渗透思路&#xff1a; 1&#xff0c; 信息收集 2&#xff0c; 漏洞扫描 3&#xff0c; 漏洞挖掘 4&#xff0c; 开始攻击 5&#xff0c; 权限维持&#xff08;持久化&#xff09; 6&#xff0c; 权限提升 7&#xff0c; 免杀隐藏 8&#xff…

[深度学习] 大模型学习1-大语言模型基础知识

大语言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;是一类基于Transformer架构的深度学习模型&#xff0c;主要用于处理与自然语言相关的各种任务。简单来说&#xff0c;当用户输入文本时&#xff0c;模型会生成相应的回复或结果。它能够完成许多任务&…

用matlab调用realterm一次性发送16进制数

realterm采用PutString接口进行发送&#xff0c;需要注意的是发送的16进制数前面要加入0x标志。只有这样&#xff0c;realterm才能将输入的字符串识别为16进制数的形式。 另外,PutString函数支持两个参数输入&#xff0c;第一个参数为字符串&#xff0c;第二个参数为发送形式&…

【C++】B2099 矩阵交换行

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述题目描述输入格式输出格式输入输出样例输入 #1输出 #1 &#x1f4af;题目分析&#x1f4af;不同解法分析我的做法实现步骤&#xff1a;优点&#xff1a;不足&#…

HTML5实现好看的博客网站、通用大作业网页模板源码

HTML5实现好看的博客网站、通用大作业网页模板源码 前言一、设计来源1.1 主界面1.2 列表界面1.3 文章界面 二、效果和源码2.1 动态效果2.2 源代码 源码下载结束语 HTML5实现好看的博客网站、通用大作业网页模板源码&#xff0c;博客网站源码&#xff0c;HTML模板源码&#xff0…

动态规划六——两个数组的dp问题

目录 题目一——1143. 最长公共子序列 - 力扣&#xff08;LeetCode&#xff09; 题目二——1035. 不相交的线 - 力扣&#xff08;LeetCode&#xff09; 题目三——115. 不同的子序列 - 力扣&#xff08;LeetCode&#xff09; 题目四—— 44. 通配符匹配 - 力扣&#xff08;…

大模型与EDA工具

EDA工具&#xff0c;目标是硬件设计&#xff0c;而硬件设计&#xff0c;您也可以看成是一个编程过程。 大模型可以辅助软件编程&#xff0c;相信很多人都体验过了。但大都是针对高级语言的软件编程&#xff0c;比如&#xff1a;C&#xff0c;Java&#xff0c;Python&#xff0c…

单片机-串转并-74HC595芯片

1、74HC595芯片介绍 74HC595 是一个 8 位串行输入、并行输出的位移缓存器&#xff0c;其中并行输出为三态输出&#xff08;即高电平、低电平和高阻抗&#xff09;。 15 和 1 到 7 脚 QA--QH&#xff1a;并行数据输出 9 脚 QH 非&#xff1a;串行数据输出 10 脚 SCLK 非&#x…

融乐 1.1.6 | 拥有海量音乐资源的第三方音乐软件,支持无损音质下载

融乐Music是一款界面优美的第三方音乐软件&#xff0c;提供海量音乐资源。用户可以通过分类和搜索轻松找到想要的歌曲&#xff0c;并享受在线畅听和下载无损音质的功能。首页设有推荐歌单、精选和排行榜&#xff0c;帮助用户发现更多好音乐。此外&#xff0c;还支持设置歌词大小…

面试场景题系列:设计搜索自动补全系统

当我们在谷歌上搜索或者在亚马逊上购物时,只要在搜索框中打字,网页上就会展示一个或者更多的与搜索词匹配的结果。这个功能叫作自动补全(Autocomplete)、提前输入(Typeahead)、边输边搜(Search-as-you-type)或者增量搜索(Incremental Search)。图-1展示了一个谷歌搜索的示例,…

Leetcode打卡:设计一个ATM机器

执行结果&#xff1a;通过 题目 2241 设计一个ATM机器 一个 ATM 机器&#xff0c;存有 5 种面值的钞票&#xff1a;20 &#xff0c;50 &#xff0c;100 &#xff0c;200 和 500 美元。初始时&#xff0c;ATM 机是空的。用户可以用它存或者取任意数目的钱。 取款时&#xff0c…

【MySQL】九、表的内外连接

文章目录 前言Ⅰ. 内连接案例&#xff1a;显示SMITH的名字和部门名称 Ⅱ. 外连接1、左外连接案例&#xff1a;查询所有学生的成绩&#xff0c;如果这个学生没有成绩&#xff0c;也要将学生的个人信息显示出来 2、右外连接案例&#xff1a;对stu表和exam表联合查询&#xff0c;把…

在 IPhone 上检查 Safari 浏览历史记录的 5 种方法

与其他网络浏览器一样&#xff0c;Safari 会保留您的浏览历史记录&#xff0c;以便您可以输入之前访问过的网页。这是一个方便的功能。 但是如何在iPhone上查看已删除的浏览历史记录呢&#xff1f; 不用担心&#xff01;在本文中&#xff0c;我们将列出 5 个经过验证的选项&a…