当前位置: 首页 > news >正文

【JVM】从 JVM 整体说明 JVM 运行的完整流程

结构

!

在这里插入图片描述

阶段类加载子系统运行时数据区执行引擎
加载加载.class文件类的元信息存入方法区-
连接验证、准备、解析方法区分配静态变量内存-
初始化-方法区更新静态变量值执行<clinit>()方法
对象创建-堆分配对象内存调用<init>()构造器
方法调用-虚拟机栈管理栈帧、PC 寄存器记录位置解释/JIT 执行字节码
GC-堆内存标记/清理垃圾回收器运行
类卸载卸载类加载器方法区释放类元信息-

工作流程

编译阶段

  1. 目标:源代码(.java) → 字节码(.class)
  • 实现方式:通过 javac 编译器将 Java 源码编译成平台无关的字节码文件,实际项目中一般通过 Maven 的 compile 命令执行了 javac 编译

类加载 Loading

  1. 目标:给 Class 在方法区分配内存空间,将.class 文件从 硬盘 → 内存,并将类的结构信息存入方法区,java.lang.Class 类对象存入堆区
  • 实现方式:通过类加载器(ClassLoader)将字节码加载到内存,将类的结构信息(方法、字段、常量池等)存入方法区,并在堆中生成 Class 对象(类的元信息)

链接阶段 Linking

  1. 目标:.class 文件在内存中二次加工
  • 验证阶段:检查字节码是否符合 JVM 规范
  • 准备阶段:在方法区中为类变量(static 变量)分配内存并附初始值
  • 解析阶段:将 “当前加载的类的常量池中的符号引用” 转为 “直接引用”

初始化 Initialization

  • 执行引擎从方法区读取类的构造器方法(**()方法)**字节码
  • 在虚拟机栈创建栈帧
  • 初始化静态变量和静态代码块(static)
  • 更新方法区中的静态变量值

运行阶段(执行引擎)

  • 解释执行:解释器逐行解释字节码为机器码
  • 即时编译:JIT 编译器优化热点代码为本地机器码,方便反复执行
  • 垃圾回收:垃圾回收器自动管理堆内存回收,回收无用对象

最终运行

  • 机器码直接执行:优化后的机器码由CPU直接运行,实现跨平台能力(依赖不同系统的JVM适配)

在这里插入图片描述


内存区

  1. 方法区(Method Area,元空间)存储已加载的类信息(HelloWorld)、方法代码、常量池等
  2. 堆(Heap):存储 对象实例,如 String 对象 "Hello, Java!"
  3. JVM 栈(Stack):存储 “方法栈帧”,包括局部变量表、操作数栈、方法返回地址等,每个线程有自己的栈
  4. 本地方法栈(Native Method Stack):存储本地方法(如write()方法)
  5. 程序计数器(PC Register):记录当前线程执行的 JVM 指令地址

工作流程示例

  1. 编译阶段:javac 编译器将 java 源代码编译为字节码文件(通过 javac 编译器执行,不属于 JVM 范畴)
  2. **类加载阶段(Loading):**类加载器将 .class 文件加载进内存,生成 Class 对象,类结构信息存入方法区。
  3. 链接阶段(Linking)
    • 验证:校验字节码格式、安全性
    • 准备:为静态变量分配内存并赋默认值
    • 解析:符号引用 → 直接引用
  4. **初始化阶段(Initialization):**执行 () 方法,赋值静态变量 & 静态代码块逻辑
  5. 运行阶段
    1. 执行引擎会通过解释器将字节码一条条翻译为机器码并立即执行
    2. 当方法调用频繁达到“热点”阈值时,JIT 编译器会将其编译为本地机器码,并存放在代码缓存区(Code Cache)用于服用从而提升性能
    3. 内存不足时会触发 GC,先是 Minor GC 回收新生代,若仍不足则执行 Major GC 或 Full GC 来清理老年代甚至方法区。
http://www.dtcms.com/a/294602.html

相关文章:

  • Redis MCP 安装与配置完整指南
  • 83、设置有人DTU设备USR-M100采集传感器数据,然后上传阿里云服务
  • 卷积神经网络:模型评估标准
  • Qt容器类:QList、QMap等的高效使用
  • 2025年7月份实时最新获取地图边界数据方法,省市区县街道多级联动【文末附实时geoJson数据下载】
  • 闲庭信步使用图像验证平台加速FPGA的开发:第三十一课——车牌识别的FPGA实现(3)车牌字符分割预处理
  • 从零开始学习Dify-Excel数据可视化(四)
  • PHP面向对象高级应用:依赖注入、服务容器与PSR标准实现
  • STL学习(四、队列和堆栈)
  • CSP-J系列【2023】P9751 [CSP-J 2023] 旅游巴士题解
  • 变频器实习DAY12
  • 接入海康设备mark全是false解决方案
  • Elasticsearch整合:Repository+RestClient双模式查询优化
  • 【杂谈】-代理协议:重塑AI协作新生态,开启智能互联新时代
  • 开闭原则在C++中的实现
  • InfluxDB HTTP API 接口调用详解(二)
  • [HarmonyOS] 鸿蒙LiteOS-A内核深度解析 —— 面向 IoT 与智能终端的“小而强大”内核
  • 算法第27天|贪心算法:合并区间 、单调递增的数字
  • 面试实战,问题七,Object类中包含哪些常用方法及其作用,怎么回答
  • biji 1
  • 开源 Arkts 鸿蒙应用 开发(十)通讯--Http数据传输
  • RAG深入理解和简易实现
  • Linux基础服务(Crontab和NFS)
  • 解决报错:ModuleNotFoundError: No module named ‘_pafprocess‘
  • 测试左移方法论
  • NX741NX777美光固态闪存NX783NX791
  • 算法思想之队列
  • 精准医学在肿瘤治疗中的应用案例研究
  • 终端VS命令解释器(Linux Windows)
  • 一招拿捏Windows的软件,仅仅1.22M