深入解析:【JavaSE】十九、JVM运行流程 类加载Class Loading

news/2026/1/18 14:20:58/文章来源:https://www.cnblogs.com/yangykaifa/p/19498458

文章目录

  • Ⅰ. 运行时数据区(内存布局)
  • Ⅱ. JVM 运行流程
    • ⭐ 大致流程
    • 一、类加载(Class Loading)
    • 二、执行引擎(Execution Engine)
    • 三、运行时数据区(Runtime Data Area)
    • 四、本地接口(Native Interface)
    • 五、垃圾回收(Garbage Collection, GC)
  • Ⅲ. 类加载 `Class Loading`
    • 一、类加载过程
    • 二、`.class` 文件的结构
    • 三、类加载器
    • 四、双亲委派模型(Parent Delegation Model)

在这里插入图片描述

Ⅰ. 运行时数据区(内存布局)

一个Java程序对应一个JVM而一个JVM对应一套数据区

在这里插入图片描述

在这里插入图片描述

  1. 程序计数器PC Register这只是一个很小的内存空间,保存着下一条执行的指令的地址

    1. 它是 每个线程私有 的,属于线程隔离的数据。
    2. 如果正在执行的是 native方法,则这个值是未定义的。
    3. 它的存在是为了解决线程切换后能恢复到正确的执行位置,因此对多线程执行非常关键。
  2. 虚拟机栈JVM Stack:存放了方法调用的关系。

    1. 虚拟机栈是线程私有的。
    2. JVM 栈中每一个元素,称为栈帧Stack Frame),每个方法在调用时都会创建一个新的栈帧。比如:局部变量,当方法运行结束后,栈帧就被销毁了,即栈帧中保存的数据也被销毁了。
    3. JVM 会抛出如 StackOverflowErrorOutOfMemoryError,都和该区域有关。
    4. 栈帧中包含:
      • 局部变量表
      • 操作数栈
      • 动态连接
      • 方法返回地址
      • 其他信息,保存的都是与方法执行时相关的一些信息。
  3. 本地方法栈Native Method Stack用于支持Native方法的调用

    1. 本地方法栈是线程私有的。
    2. 本地方法栈与虚拟机栈的作用类似,只不过保存的内容是 Native 方法的局部变量。
    3. 底层是 C/C++ 实现的。
    4. 在有些版本的 JVM 实现中(例如HotSpot),本地方法栈和虚拟机栈是一起的。
  4. HeapJVM 中最大的内存区域,保存使用new创建的对象实例

    1. 堆是线程共享的。
    2. 堆的生命周期:堆是随着程序开始运行时而创建,随着程序的退出而销毁,堆中的数据只要还有在使用,就不会被销毁。
    3. 堆是垃圾回收器的主要工作场所。
    4. 堆细分为:新生代(一个Eden、两个Survivor老年代
    5. 堆中每个对象不只是包含字段值,在每个对象的开头还保存了对象头结构,用来管理对象运行时信息的元数据容器,每个 Java 对象在内存中分为三部分:
      • 对象头Header):存储锁状态、GC 分代年龄、哈希码等
      • 实例数据Instance Data):对象的字段值
      • 对齐填充Padding):补齐内存对齐
  5. 方法区(Method Area存储类的元数据信息对象实例存放在堆中,方法区只是存放类的元数据

    1. 方法区是线程共享的。

    2. 实际上在 Java8 以后,方法区被 “元数据区” 替代,从原来的 “堆内存” 中移到 “本地内存” 中。

       +-------------------------------+| 操作系统分配的总内存(物理RAM)|+-------------------------------+|           ||           +------------------+|                              |+--------v------+        +--------------v------------------+| JVM 管理区域   |        | JVM 外部使用但不直接管理(本地内存)||               |        |                                 ||  - 堆(heap)  |        |  - 元空间(Metaspace)           ||  - 栈(stack) |       |   - DirectBuffer / JNI 内存      ||  - 程序计数器  |        |  - JIT 编译缓存 / 线程内部结构    |+--------------+        +----------------------------------+
    1. 存储内容包括:

      • 类的结构信息(字段、方法、接口、访问修饰符等等)
      • 静态变量
      • 运行时常量池(字面量、符号引用)
      • JIT 编译后的代码(在某些实现中)

在这里插入图片描述

Ⅱ. JVM 运行流程

⭐ 大致流程

JVM 执行流程大概如下所示:

在这里插入图片描述

口诀: 编译成 class,加载做五步,解释+JIT,运行靠内存,回收靠 GC。

一、类加载(Class Loading)

类加载是 JVM.class 文件(字节码)加载进内存,并在内存中生成一个 Class 对象的 全过程,包括下面三个主要阶段:

  1. 加载:通过类加载器把字节码读进来,生成 Class 对象。
  2. 链接:分为验证、准备、解析三个子阶段。
  3. 初始化:执行 <clinit> 静态代码块和静态变量赋值。

二、执行引擎(Execution Engine)

JVM 核心部件,负责执行字节码:

三、运行时数据区(Runtime Data Area)

JVM 内存模型,运行时管理所有数据:

区域作用描述
方法区(Method Area)存储类的信息(类元数据)、常量、静态变量等
堆(Heap)存储对象实例,是垃圾回收的主要区域
虚拟机栈(Stack)每个线程私有,存储方法调用的信息(帧栈)、局部变量等
本地方法栈为执行 native 方法准备
程序计数器(PC)每个线程私有,记录当前线程所执行的字节码行号

四、本地接口(Native Interface)

JVM 可以调用本地语言(如 C、C++)写的函数,依赖 JNIJava Native Interface)。

五、垃圾回收(Garbage Collection, GC)

  • 自动管理堆内存,回收无用对象
  • 分代回收:新生代、老年代
  • 常见算法:标记-清除、复制、标记-整理等

Ⅲ. 类加载 Class Loading

一个类在什么时候触发 “加载” 呢❓❓❓

① 构造某个类的实例时

② 调用类的静态方法/静态成员时

③ 使用子类时,也会触发父类的加载

对于一个类来说,它的生命周期是这样子的:
在这里插入图片描述

其中前五步是固定的顺序,也是类加载的过程!

一、类加载过程

  1. 加载(Loading)
    1. JVM 根据类的 “全限定名”,委托给类加载器去加载该类,并遵循 双亲委派模型
    2. 然后类加载器从 .class 文件中读取字节流
    3. 最后 JVM 将字节流解析为 Class 对象,放入方法区中(这不等于立即解析所有内容)
  2. 验证(Verification)
    1. 确保类的字节码是合法的,防止恶意代码执行:
      • 文件格式验证(确保这是一个 “能看懂” 的 .class 文件,不是乱写的二进制)
      • 元数据验证(确保类的结构层次是 “符合 Java 语义的”)
      • 字节码验证(防止非法操作、恶意字节码,比如篡改局部变量、栈顶数据,JVM 崩溃)
      • 符号引用验证(为解析阶段提前做准备,避免运行时解析失败)
  3. 准备(Preparation)
    1. 为类的 静态变量 分配内存,并设置 默认初始值(不是代码中的赋值)。比如 static int a = 10;只分配内存,初始化为默认值0,而还没到赋值为 10 的阶段。
  4. 解析(Resolution)
    1. 将常量池中的 符号引用(如类名、字段名)转换为实际的 直接引用(内存地址),即对常量进行初始化
  5. 初始化(Initialization)
    1. 执行类的构造方法(类构造器),即静态变量赋值、静态代码块执行等。

二、.class 文件的结构

.class 文件是一个 以字节为单位的严格二进制格式 的结构体,包含类的所有元信息方法字节码常量池等。如下所示:

ClassFile {
u4 magic;                        // 魔数,标识文件的类型
u2 minor_version;                // 次版本号
u2 major_version;                // 主版本号
u2 constant_pool_count;          // 常量池数量
cp_info constant_pool[];         // 常量池,包括字符串、类名、方法名、字段名等,最核心的部分
u2 access_flags;                 // 访问标志(public, abstract, final等)
u2 this_class;                   // 当前类的索引(指向常量池)
u2 super_class;                  // 父类索引(指向常量池)
u2 interfaces_count;             // 实现接口数量
u2 interfaces[];                 // 接口表
u2 fields_count;                 // 字段数量
field_info fields[];             // 字段表
u2 methods_count;                // 方法数量
method_info methods[];           // 方法表
u2 attributes_count;             // 属性数量
attribute_info attributes[];     // 属性表(如源码信息、注解、行号表等)
}

三、类加载器

类加载器(ClassLoader)是类加载机制的核心,本质上就是一个 "负责读取类的字节流并交给JVM转换为Class对象" 的工具

JVM 提供了 三种主要的类加载器

类加载器作用
Bootstrap ClassLoader启动类加载器:加载 java 核心类库
Extension ClassLoader扩展类加载器:加载拓展目录下的类(jdk 自带但不是标准约定的库)
Application ClassLoader应用类加载器:加载你写的代码和第三方库类

四、双亲委派模型(Parent Delegation Model)

在类加载的加载阶段JVM 会根据类的全限定名,通过类加载器加载该类。类加载器在加载类时默认遵循 “双亲委派模型”,即优先让父类加载器尝试加载类,只有在父加载器无法加载时,才由当前加载器尝试加载。

原则:从下往上委托,然后先父后子,从上往下加载
在这里插入图片描述

过程如下所示:

  1. 当前类加载器先将请求委托给父类加载器,注意是层层委托上去,直到最高层加载器。
  2. 然后从最高层父类加载器开始加载 class 文件,如果加载不到,则一层一层往下尝试是否能进行加载。

这样子做是为了保证:

  1. java.lang.ObjectString 这类核心类一定由 启动类加载器 加载,避免用户自定义的类覆盖核心类,提升安全性。
    1. 比如用户伪造了一个 java.lang.String,但加载器是从上往下的,此时会先加载父类中的 java.lang.String,而不会加载到用户伪造的那个版本!
  2. 避免类的重复加载
    1. 比如 A 类和 B 类都有一个父类 C 类,那么当 A 启动时就会将 C 类加载起来,那么在 B 类进行加载时就不需要在重复加载 C 类了。

在这里插入图片描述

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

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

相关文章

2026年求推荐靠谱的AI智能办公鼠标,南方网通鸿容鼠标别错过 - 工业品牌热点

2026年AI技术深度融入办公与营销场景,AI智能办公鼠标作为轻量级生产力入口,已成为企业降本增效、个人高效创作的关键工具。无论是五合一大模型集成的全场景适配,还是办公营销双功能覆盖的便捷性,优质AI智能办公鼠标…

四边形不等式相关

四边形不等式相关四边形不等式 我们称一个二元函数 \(w(i, j)\) 满足四边形不等式,当且仅当对于任意 \(a \le b \le c \le d\) 满足: \[w(a, c) + w(b, d) \le w(a, d) + w(b, c) \]即交叉小于包含。 其可以用来对转…

Tops新年赛总结

热烈祝贺拓尔思2026新年赛圆满结束! 先说一下对本次比赛的评价 这次比赛的题组的蛮好的,很符合我这种第一次正式打ACM赛制比赛(THUPC那次在摆烂不算)的蒟蒻。 同时,绿绿蓝蓝的小清新题还是很符合大家的口味的。其…

VisionMaster之上下相机对位贴合

VisionMaster之上下相机对位贴合 一 上相机对位贴合 1.1 九点标定1.2 确定基准位置1.3 旋转中心标定1.4 定位纠偏二 下相机对位贴合 1.1 九点标定 1.2 确定基准位置 1.3 旋转中心标定 1.4 定位纠偏 三 上下相机联合

总结2026年轴承老牌代理厂家,伯陆商城优势显著 - 工业品牌热点

本榜单依托全维度市场调研与真实行业口碑,深度筛选出五家标杆企业,为工业制造企业选型进口轴承及传动零部件代理伙伴提供客观依据,助力精准匹配适配的服务供应商。 TOP1 推荐:伯陆(上海)动力技术有限公司 推荐指…

2026年苏州食材配送一站式服务保障排名,旺利涛食品实力上榜! - 工业品牌热点

本榜单依托全维度市场调研与真实行业口碑,深度筛选出五家标杆企业,为长三角地区企事业单位食堂、连锁餐饮门店等B端客户选型提供客观依据,助力精准匹配适配的生鲜食材配送服务伙伴。 TOP1 推荐:苏州旺利涛食品贸易…

2026年市面上做得好的高架库企业排名,高架库/智能仓储/智能仓库/立体仓储/全自动仓库,高架库公司如何选 - 品牌推荐师

当前,制造业与物流业对仓储效率的要求持续提升,高架库凭借其空间利用率高、自动化程度强、作业效率显著等核心优势,成为企业智能化升级的重要选择。然而,市场鱼龙混杂,如何筛选技术可靠、服务优质的高架库工厂,成…

1月17号和18号总结

这两天主要熟悉整个项目的业务流程和项目结构 以及学习微服务架构的基础组件以及使用 目前整个项目已经跑通,已经熟悉代码的功能结构 这是个人人开源上的模版项目,对于之前都是自己搭建项目,所谓的大作业,老师验收…

【参数优化】基于带动态边界 + 周期性重置 + 惯性权重衰减的粒子群优化三环自动驾驶仪设计二阶 高阶控制系统的双参数控制器附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 &#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室 &#x1f447; 关注我领取海量matlab电子书和数学建模资料 &#…

解决局域网 NAS 远程桌面连接失败:火绒“误伤”排查实录

1. 问题背景最近在访问家中的 NAS(Windows 系统)时遇到了一个诡异的问题:​故障现象:台式机通过网线尝试远程桌面连接(RDP)NAS 总是失败;切换到无线网络时,连接状态极其不稳定,时断时续。​交叉验证:手机端使…

树剖总结

树链剖分总结 一些不太可能无关紧要的事情 个人感觉树剖挺恶心的。 3K码量让我还以为在写大模拟。 调试不仅调线段树,还要调DFS和LCA 食屎寄酸罚 一些不太可能会犯的错你是怎么做到把修改函数带返回值的?首先,就是大…

Flutter 与开源鸿蒙(OpenHarmony)国际化、无障碍与合规开发实践:打造全球可用的可信应用 - 详解

Flutter 与开源鸿蒙(OpenHarmony)国际化、无障碍与合规开发实践:打造全球可用的可信应用 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block …

Invicti Standard v26.1.0 for Windows - 企业级 Web 应用与 API 安全

Invicti Standard v26.1.0 for Windows - 企业级 Web 应用与 API 安全 Invicti (formerly Netsparker) | Web Application and API Security for Enterprise 请访问原文链接&#xff1a;https://sysin.org/blog/invicti/ 查看最新版。原创作品&#xff0c;转载请保留出处。 …

课题:PLC控制的变频电梯系统的设计(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

课题&#xff1a;PLC控制的变频电梯系统的设计(设计源文件万字报告讲解)&#xff08;支持资料、图片参考_相关定制&#xff09;_文章底部可以扫码 毕业设计调研报告 可编程控制器是一种用小处理器作为核心&#xff0c;在和电脑以及互联网等东西一起开发的一种控制装置用在工业生…

聊聊专业翻译企业,天使翻译公司质量保障与服务优势有哪些? - 工业品牌热点

本榜单依托全维度市场调研与真实行业口碑,深度筛选出五家标杆翻译企业,为有语言服务需求的个人与企业提供客观依据,助力精准匹配适配的服务伙伴。 TOP1 推荐:天使(上海)外语翻译有限公司 推荐指数:★★★★★ |…

人生死机了?别慌,这是系统升级

《解锁真正的自我:一场深入内心的成长之旅》专栏 系列四:穿越转折之谷 第1篇 转折期的三阶段:如何体面地“结束”与“重生”? —— 在人生死机后,优雅地完成一次系统重装 面对生活的突然停摆,别急着重启,先让系统“散热”一会儿。 凌晨三点的“蓝屏”时刻 凌晨三点…

Comsol脉冲涡流无损检测仿真 图一:脉冲涡流仿真,检出电压信号 图二:脉冲涡流模型 图三:...

Comsol脉冲涡流无损检测仿真 图一&#xff1a;脉冲涡流仿真&#xff0c;检出电压信号 图二&#xff1a;脉冲涡流模型 图三&#xff1a;磁通密度模 图四&#xff1a;磁通密度模线圈贴着金属板扫过&#xff0c;检测仪突然滴滴作响——这种非接触式探伤场景在工业检测中司空见惯。…

哈希表的c++实现及其常用函数

代码示例: include include include include include<unordered_map> using namespace std; int main() { //----------1.创建哈希表:键为String类型,值为int类型---------- unordered_map<string, int>…

自动售货机(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

自动售货机(源码万字报告实物) 摘 要 自动售货机的应用&#xff0c;不仅可以充分节省人力资源&#xff0c;而且还促进商业贸易发展&#xff0c;给人们的生活带来诸多便利。可编程控制器作为控制系统的大脑&#xff0c;按照工艺说明分析&#xff0c;对各种外部输入信号按照系统的…

2026必备!9个AI论文工具,专科生轻松搞定毕业论文!

2026必备&#xff01;9个AI论文工具&#xff0c;专科生轻松搞定毕业论文&#xff01; AI 工具如何改变论文写作的未来 随着人工智能技术的飞速发展&#xff0c;越来越多的学生开始借助 AI 工具来提升论文写作的效率和质量。尤其是对于专科生而言&#xff0c;面对繁重的学业压力…