0

0

JVM 架构组成与执行流程完整解析

舞夢輝影

舞夢輝影

发布时间:2026-03-16 09:19:31

|

835人浏览过

|

来源于php中文网

原创

JVM是实现“一次编写,到处运行”的软件抽象层,核心由运行时数据区(方法区、堆、虚拟机栈、本地方法栈、程序计数器)、类加载机制(加载、验证、准备、解析、初始化)和执行引擎(解释器+JIT编译器)组成。

jvm 架构组成与执行流程完整解析

JVM(Java Virtual Machine)不是一台真实硬件,而是一个规范定义的软件抽象层,其核心目标是实现“一次编写,到处运行”。它通过将 Java 源码编译为与平台无关的字节码(.class 文件),再由不同平台上的 JVM 实现负责解释或编译执行,从而屏蔽底层差异。理解其架构组成与执行流程,是调优、排错和深入 Java 生态的关键基础。

核心组件:运行时数据区与执行引擎

JVM 运行时数据区是内存逻辑划分,各区域职责明确、生命周期不同:

  • 方法区(Method Area):存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等。JDK 8 后被元空间(Metaspace)取代,使用本地内存,避免永久代(PermGen)OOM;
  • 堆(Heap):所有线程共享,存放对象实例和数组,是垃圾收集的主要区域,划分为新生代(Eden + Survivor)和老年代;
  • 虚拟机栈(Java Stack):每个线程私有,描述 Java 方法执行的内存模型,每个方法对应一个栈帧(Frame),包含局部变量表、操作数栈、动态链接、方法出口等;
  • 本地方法栈(Native Method Stack):为 Native 方法服务,如 JNI 调用,部分实现(如 HotSpot)与 Java 栈合二为一;
  • 程序计数器(PC Register):当前线程所执行字节码的行号指示器,唯一不会发生 OutOfMemoryError 的区域,线程私有。

类加载机制:从 .class 到可执行状态

类加载不是一次性完成,而是按需触发,全过程包括五个阶段(加载、验证、准备、解析、初始化),其中验证、准备、解析统称“连接”:

Tweeze
Tweeze

Tweeze.app是一个AI驱动的个性化新闻简报服务,定位为个人互联网AI阅读助手

下载
  • 加载:通过类的全限定名获取二进制字节流(可来自 classpath、JAR、网络、动态生成等),转为 Class 对象存入方法区,并在堆中生成 java.lang.Class 实例;
  • 验证:确保字节码符合 JVM 规范(如格式、语义、符号引用有效性),防止恶意或错误代码危害虚拟机安全;
  • 准备:为类变量(static 变量)分配内存并设默认值(如 0、null),不执行赋值语句(那是初始化阶段的事);
  • 解析:将常量池中的符号引用(如类名、字段名、方法名)替换为直接引用(内存地址或偏移量);
  • 初始化:真正执行类构造器 <clinit> 方法,按代码顺序给 static 变量赋值、执行 static 块,有且仅有一个线程能执行,其他线程阻塞等待。

执行引擎:解释、编译与优化协同工作

JVM 不直接执行字节码,而是通过执行引擎将其转化为机器指令。HotSpot VM 采用“解释器 + JIT 编译器”混合模式:

  • 解释器(Interpreter):逐行读取字节码,边解释边执行,启动快、占用内存小,但执行效率低;
  • JIT 编译器(Just-In-Time):监控热点代码(如方法被频繁调用或循环体执行次数超阈值),将其编译为本地机器码并缓存(CodeCache),后续直接执行,大幅提升性能;
  • 分层编译(Tiered Compilation):JDK 7+ 默认启用,共 5 层:第 0 层(解释执行)、1–4 层逐步启用 C1(Client Compiler,快速编译+简单优化)和 C2(Server Compiler,深度优化),兼顾启动速度与峰值性能;
  • GC 协同:执行引擎需与垃圾收集器协作,例如在安全点(Safepoint)暂停所有线程,完成 GC 或栈帧更新等关键操作。

运行与退出:从 main() 到 JVM 终止

一个 Java 程序的生命周期始于 main 方法入口,终于 JVM 退出:

  • 启动时,JVM 创建主线程(main thread),加载并初始化包含 main 方法的主类;
  • main 方法压入栈帧,执行过程中可能创建新线程(每个线程拥有独立栈)、分配对象(堆中)、调用 native 方法(本地方法栈)、访问常量(方法区);
  • 当所有非守护线程(non-daemon threads)结束,或显式调用 System.exit(),JVM 开始正常退出流程:执行 shutdown hooks(注册的钩子函数)、释放资源、销毁虚拟机;
  • 若发生未捕获异常、OOM 或 fatal error(如断言失败、内部错误),JVM 可能异常终止,输出 hs_err_pid*.log 日志供诊断。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

254

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1132

2024.03.01

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1570

2023.10.24

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

513

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

384

2023.10.25

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

448

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

606

2023.08.10

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

448

2023.07.18

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

69

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号