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 的值为 0static 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 高效运行的基础,精确的存储分配和管理确保了类的正确运行和内存的优化使用。

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

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

相关文章

计算机网络——数据链路层-流量控制和可靠传输

一、流量控制 流量控制是指由接收方及时控制发送方发送数据的速率&#xff0c;使接收方来得及接受。 • 停止等待流量控制 • 滑动窗口流量控制 1、停止—等待流量控制 停止-等待流量控制的基本原理是发送方每发出一帧后&#xff0c;就要等待接收方的应答信号&#xff…

Linux运维相关基础知识(二)

系列文章目录 Linux常用命令 linux 账号管理与权限设定 Linux运维相关基础知识 文章目录 系列文章目录前言1. 自动任务执行at 与 atdcrontab 与 crond 2. SELinuxtty多任务管理与进程管理相关的命令/proc/* 文件的意义SELinux 3. 守护进程早期SystemV的init管理行为中daemon…

【CSS】第一天 基础选择器与文字控制属性

【CSS】第一天 1. CSS定义2. css引入方式2.1 内部样式2.2 外部样式2.3 行内样式 3. 选择器3.1 标签选择器3.2 类选择器3.3 id选择器3.4 通配符选择器 1. CSS定义 层叠样式表(CSS)是一种样式表语言&#xff0c;用来描述HTML文档的呈现(美化内容)。 书写位置&#xff1a;title标…

QT----------QT Data Visualzation

实现思路&#xff1a; 配置项目&#xff1a;在 .pro 文件中添加 QT datavisualization 以引入 QT Data Visualization 模块。创建主窗口&#xff1a;使用 QMainWindow 作为主窗口&#xff0c;添加 Q3DScatter、Q3DBars 和 Q3DSurface 等三维视图组件。初始化和创建三维图表&a…

连接Milvus

连接到Milvus 验证Milvus服务器正在侦听哪个本地端口。将容器名称替换为您自己的名称。 docker port milvus-standalone 19530/tcp docker port milvus-standalone 2379/tcp docker port milvus-standalone 192.168.1.242:9091/api/v1/health 使用浏览器访问连接地址htt…

AlphaPi相关硬件驱动提取

初涉硬件编程&#xff0c;在咸鱼上搞了几块AlphaPi和microbit的板鼓捣了一下&#xff0c;alphapi生态不完善&#xff0c;网上又无任何文档&#xff0c;搞封闭&#xff0c;可玩性实在有限&#xff0c;但貌似相关扩展板是可以插microbit的&#xff0c;于是想把这些扩展版用microb…

Nginx——静态资源部署(二/五)

目录 1.Nginx 服务器基础配置实例2.Nginx 服务操作的问题及解决方案2.1.Nginx 配置成系统服务2.2.Nginx 命令配置到系统环境 3.Nginx 静态资源部署3.1.Nginx 静态资源概述3.2.Nginx 静态资源的配置指令3.2.1.listen 指令3.2.2.server_name 指令3.2.2.1.配置方式3.2.2.2.匹配执行…

第0章 机器人及自动驾驶SLAM定位方法全解析及入门进阶学习建议

嗨&#xff0c;各位同学大家好&#xff01;笔者自985硕士毕业后&#xff0c;在机器人算法领域已经深耕 7 年多啦。这段时间里&#xff0c;我积累了不少宝贵经验。本专栏《机器人工程师带你从零入门SLAM》将结合下面的SLAM知识体系思维导图及多年的工作实战总结&#xff0c;将逐…

Vue 全局事件总线:Vue 2 vs Vue 3 实现

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

xml格式化(1):使用python的xml库实现自闭合标签

前言 最近一段时间一直想要写一个urdf格式化插件。 至于为什么嘛&#xff0c;因为使用sw2urdf插件&#xff0c;导出的urdf&#xff0c;同一标签的内容&#xff0c;是跨行的&#xff0c;这就导致&#xff0c;内容比较乱&#xff0c;而且行数比较多。影响阅读。 因此&#xff…

模型 九屏幕分析法

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。九屏幕法&#xff1a;全方位分析问题的系统工具。 1 九屏幕分析法的应用 1.1 新产品研发的市场分析 一家科技公司计划开发一款新型智能手机&#xff0c;为了全面评估市场潜力和风险&#xff0c;他们…

基于开发/发布/缺陷分离模型的 Git 分支管理实践20250103

基于开发/发布/缺陷分离模型的 Git 分支管理实践 引言 在现代软件开发中&#xff0c;合理的分支管理策略是保证项目成功的关键因素之一。本文将详细介绍一种基于开发/发布/缺陷分离的 Git 分支管理模型&#xff0c;这种模型不仅能提升团队协作效率&#xff0c;还能确保代码质…

前端工程化之手搓webpack5 --【elpis全栈项目】

前端工程化之手搓webpack5 --【elpis全栈项目】 导读 基本流程&#xff1a;输入 – 编译 – 输出 #mermaid-svg-V8Gi7RFNikCuEhax {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-V8Gi7RFNikCuEhax .error-icon{fil…

【ArcGIS Pro二次开发实例教程】(1):图层的前置、后置

一、简介 此工具要实现的功能是&#xff1a;将内容框中当前选定的图层移到最顶层或最底层。 主要技术要点包括&#xff1a; 1、Config.daml文件设置&#xff08;UI设置&#xff09; 2、按钮的图片和位置设置 3、当前选定图层的获取 4、图层在内容列表中位置的获取和移动 …

2023最新版IDEA创建一个SpringBoot项目 (详细教程)

在IDEA中创建一个SpringBoot项目 springboot是我们java开发中最流行的框架之一&#xff0c;下面我们看看如何在idea中创建一个springboot项目。 文章目录 在IDEA中创建一个SpringBoot项目一、springboot简单介绍二、快速开始1.新建项目2.配置Maven3.测试 总结 一、springboot简…

Spring SpEL表达式由浅入深

标题 前言概述功能使用字面值对象属性和方法变量引用#this 和 #root变量获取类的类型调用对象(类)的方法调用类构造器类型转换运算符赋值运算符条件(关系)表达式三元表达式Elvis 操作符逻辑运算instanceof 和 正则表达式的匹配操作符 安全导航操作员数组集合(Array 、List、Map…

Jetpack Compose 学习笔记(四)—— CompositionLocal 与主题

Compose 中的主题内的代码大量定义了 CompositionLocal&#xff0c;因此在学习主题之前&#xff0c;先学习 CompositionLocal 铺垫好基础。 1、CompositionLocal 1.1 显式传参与隐式传参 显式传参需要依赖函数的调用&#xff0c;层层传递&#xff1b;隐式传参通过创建全局变量…

利用webworker解决性能瓶颈案例

目录 js单线程的问题webworker的基本使用webworker的常见应用可视化优化导出Excel js单线程的问题 众所周知&#xff0c;js不擅长计算&#xff0c;计算是同步的&#xff0c;大规模的计算会让js主线程阻塞&#xff0c;导致界面完成卡死。比如有一个600多亿次的计算&#xff0c;…

【数据结构05】排序

系列文章目录 【数据结构05】排序 . 【算法思想04】二分查找 文章目录 系列文章目录[toc] 1. 基本思想与实现1.1 插入类排序1.1.1 直接插入排序&#xff08;*&#xff09;1.1.2 折半插入排序1.1.3 希尔排序&#xff08;*&#xff09; 1.2 交换类排序1.2.1 冒泡排序&#xff08…

数据挖掘——概论

数据挖掘——概论 数据、信息和知识的关联和联系数据挖掘数据挖掘定义数据挖掘的步骤数据挖掘的主要内容 数据、信息和知识的关联和联系 数据、信息和知识是知识工作者感知和认识客观事物的3个连贯的阶段。 数据无处不在&#xff0c;聚合/集成后转化为信息&#xff0c;结构化后…