当前位置: 首页 > 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.lryc.cn/news/597517.html

相关文章:

  • C#与WPF使用mvvm简单案例点击按钮触发弹窗
  • 基于阿里云平台的文章评价模型训练与应用全流程指南
  • nginx.conf配置文件以及指令详解
  • 人工智慧是引擎,人类是方向盘:Vitalik对AI未来的深刻反思
  • 关于SPring基础和Vue的学习
  • rust嵌入式开发零基础入门教程(六)
  • 什么是MySQL 视图
  • 综合实验(3)
  • 暑期自学嵌入式——Day06(C语言阶段)
  • 7月23日星期三今日早报简报微语报早读
  • 51c大模型~合集158
  • Vue 3 组件通信全解析:从 Props 到 Pinia 的深入实践
  • 用 llama.cpp 构建高性能本地 AI 应用:从环境搭建到多工具智能体开发全流程实战
  • Python应用指南:构建和获取全球地铁线路数据及可视化
  • ToBToC的定义与区别
  • 从 XSS 到 Bot 攻击:常见网络攻击防不胜防?雷池 WAF 用全场景防护为网站筑牢安全墙
  • Java中IO多路复用技术详解
  • S段和G段到底有什么区别
  • 基于springboot的乡村旅游在线服务系统/乡村旅游网站
  • 网络--VLAN技术
  • 在 Ubuntu 20.04.5 LTS 系统上安装 Docker CE 26.1.4 完整指南
  • OpenLayers 快速入门(五)Controls 对象
  • centos9 ssh能连接密码不对
  • 电脑32位系统能改64位系统吗
  • GoLand 项目从 0 到 1:第一天 —— 搭建项目基础架构与核心雏形
  • 抖音集团基于Flink的亿级RPS实时计算优化实践
  • 学生信息管理系统 - HTML实现增删改查
  • istio-proxy用哪个端口代理http流量的?
  • Vue 浏览器本地存储
  • 游戏盾 SDK 和游戏盾转发版有什么区别呢?​