详细介绍:JVM架构与执行流程详解

news/2025/12/4 14:30:05/文章来源:https://www.cnblogs.com/tlnshuju/p/19307334

详细介绍:JVM架构与执行流程详解

2025-12-04 14:27  tlnshuju  阅读(0)  评论(0)    收藏  举报

JVM架构与执行流程详解

概述

Java虚拟机(JVM)是Java平台的核心组件,负责执行Java字节码,提供平台无关性、自动内存管理和安全性等特性。本文详细解析JVM的构成和各部分功能,以及Java程序的完整执行流程。

一、JVM的构成和各部分功能

1. 类加载器子系统(ClassLoader Subsystem)

功能职责
  • 加载(Loading):读取.class文件到内存中
  • 链接(Linking):验证、准备、解析字节码
  • 初始化(Initialization):执行类构造器方法
三个核心加载器

1. 启动类加载器(Bootstrap ClassLoader)

2. 扩展类加载器(Extension ClassLoader)

3. 应用程序类加载器(Application ClassLoader)

双亲委派模型
  • 类加载请求首先委派给父加载器
  • 父加载器无法加载时,子加载器才尝试加载
  • 确保类的唯一性和安全性

2. 运行时数据区(Runtime Data Areas)

2.1 方法区(Method Area)

功能职责

  • 存储类结构信息(类名、父类、接口、字段、方法等)
  • 存储运行时常量池(字符串常量、数字常量等)
  • 存储静态变量和类变量
  • 存储方法字节码和即时编译器编译后的代码

内存特性

  • 所有线程共享的内存区域
  • 在JVM启动时创建
  • 逻辑上是堆的一部分,但物理上可以独立
  • 可选择垃圾回收
2.2 堆(Heap)

功能职责

内存分区

新生代(Young Generation)

老年代(Old Generation)

永久代/元空间(PermGen/Metaspace)

2.3 Java栈(Java Stack)

功能职责

  • 存储方法调用的栈帧(Stack Frame)
  • 每个方法调用对应一个栈帧

栈帧结构

局部变量表(Local Variable Table)

  • 存储方法参数和局部变量
  • 以变量槽(Slot)为单位
  • 基本类型和引用类型占用不同槽数

操作数栈(Operand Stack)

  • 用于字节码指令执行时的操作数存储
  • 后进先出(LIFO)结构
  • 指令从栈顶获取操作数,结果压入栈顶

动态链接(Dynamic Linking)

  • 指向运行时常量池中该栈帧所属方法的引用
  • 支持方法调用时的动态绑定

方法返回地址(Return Address)

  • 存储方法正常或异常返回后的执行地址
2.4 程序计数器(Program Counter Register)

功能职责

特性

2.5 本地方法栈(Native Method Stack)

功能职责

  • 支持本地方法(Native Method)的执行
  • 与Java栈类似,但服务于本地方法

特性

  • 线程私有
  • 可能使用传统的栈(如C栈)来支持本地方法调用
  • 具体实现取决于JVM设计

3. 执行引擎(Execution Engine)

3.1 解释器(Interpreter)

功能职责

  • 逐条读取、解释和执行字节码指令
  • 实现简单,启动速度快

工作流程

  1. 读取字节码指令
  2. 解码指令含义
  3. 执行相应操作
  4. 移动到下一条指令
3.2 即时编译器(JIT Compiler)

功能职责

编译策略

客户端编译器(C1)

服务器端编译器(C2)

分层编译(Tiered Compilation)

3.3 垃圾回收器(Garbage Collector)

功能职责

  • 自动回收不再使用的对象内存
  • 防止内存泄漏和内存溢出

垃圾回收算法

标记-清除算法(Mark-Sweep)

  • 标记所有存活对象
  • 清除未标记的对象
  • 产生内存碎片

复制算法(Copying)

  • 将内存分为两个区域
  • 将存活对象复制到另一个区域
  • 清理原区域
  • 适用于新生代

标记-整理算法(Mark-Compact)

  • 标记存活对象
  • 将对象向一端移动
  • 清理边界外的内存
  • 适用于老年代

分代收集算法(Generational Collection)

  • 根据对象生命周期采用不同策略
  • 新生代使用复制算法
  • 老年代使用标记-清除或标记-整理算法

4. 本地方法接口(JNI)

功能职责

主要功能

二、Java程序的完整执行流程

阶段1:编写和编译

1.1 编写Java源代码
// HelloWorld.java
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
1.2 编译成字节码
javac HelloWorld.java

编译过程

  1. 词法分析:将源代码分解为标记(Token)
  2. 语法分析:构建抽象语法树(AST)
  3. 语义分析:类型检查和方法解析
  4. 字节码生成:生成.class文件

阶段2:类加载过程

2.1 加载(Loading)

加载步骤

  1. 通过类的全限定名获取定义此类的二进制字节流
  2. 将这个字节流所代表的静态存储结构转换为方法区的运行时数据结构
  3. 在内存中生成一个代表这个类的java.lang.Class对象

类加载器工作流程

  1. 检查类是否已加载
  2. 委派父加载器加载
  3. 父加载器无法加载时,自己尝试加载
  4. 读取.class文件到内存
2.2 链接(Linking)

验证(Verification)

  • 文件格式验证:确保.class文件格式正确
  • 元数据验证:对类的元数据进行语义校验
  • 字节码验证:确保方法体不会危害虚拟机安全
  • 符号引用验证:确保解析动作能正确执行

准备(Preparation)

  • 为类变量分配内存并设置初始值
  • 静态变量分配在方法区
  • 初始值为零值(0、false、null等)

解析(Resolution)

  • 将常量池内的符号引用替换为直接引用
  • 类或接口的解析
  • 字段解析
  • 类方法解析
  • 接口方法解析
2.3 初始化(Initialization)

初始化时机

初始化过程

  1. 执行类构造器()方法
  2. ()方法由编译器自动收集类中所有类变量的赋值动作和静态语句块合并产生
  3. 父类的()方法先于子类执行
  4. 接口的()方法不需要先执行父接口的()方法

阶段3:运行时执行

3.1 创建主线程

JVM启动流程

  1. 创建引导类加载器(Bootstrap ClassLoader)
  2. 加载核心Java类库
  3. 创建Launcher实例
  4. 创建应用程序类加载器
  5. 加载主类
  6. 调用主类的main()方法
3.2 方法调用执行

栈帧创建和压栈

public class MethodDemo {
public static void main(String[] args) {
int result = calculate(10, 20);
System.out.println("Result: " + result);
}
public static int calculate(int a, int b) {
int sum = a + b;
return sum * 2;
}
}

执行流程

  1. main方法栈帧压入Java栈
  2. 局部变量表存储args参数
  3. 调用calculate方法,创建新的栈帧
  4. calculate方法栈帧压栈
  5. 执行字节码指令
  6. 方法返回,栈帧弹出
3.3 字节码指令执行

常见字节码指令

  • 加载和存储指令:iload, istore, aload, astore
  • 运算指令:iadd, isub, imul, idiv
  • 类型转换指令:i2l, i2f, i2d
  • 对象操作指令:new, getfield, putfield
  • 方法调用指令:invokevirtual, invokestatic, invokeinterface
  • 控制转移指令:ifeq, ifne, goto
3.4 对象创建和内存分配

对象创建流程

  1. 类加载检查:检查new指令的参数是否能在常量池中定位到类的符号引用
  2. 分配内存:在堆中为对象分配内存空间
  3. 内存空间初始化:将分配的内存空间都初始化为零值
  4. 设置对象头:设置对象的类元数据信息、哈希码、GC分代年龄等
  5. 执行方法:按照程序员的意愿进行初始化

内存分配策略

阶段4:内存管理和垃圾回收

4.1 垃圾识别算法

引用计数法(Reference Counting)

可达性分析算法(Reachability Analysis)

GC Roots对象包括

4.2 垃圾回收算法

标记-清除算法(Mark-Sweep)

标记阶段:遍历所有对象,标记存活对象
清除阶段:回收未标记的对象内存
优点:实现简单
缺点:产生内存碎片,效率不稳定

复制算法(Copying)

将内存分为大小相等的两块
每次只使用其中一块
垃圾回收时,将存活对象复制到另一块
清理已使用的内存块
优点:没有内存碎片
缺点:内存利用率只有50%

标记-整理算法(Mark-Compact)

标记阶段:标记所有存活对象
整理阶段:将存活对象向一端移动
清理阶段:清理边界外的内存
优点:没有内存碎片
缺点:移动对象成本较高

分代收集理论

  • 弱分代假说:绝大多数对象都是朝生夕死的
  • 强分代假说:熬过越多次垃圾收集过程的对象就越难以消亡
  • 跨代引用假说:跨代引用相对于同代引用来说仅占极少数
4.3 垃圾回收器

Serial收集器

  • 单线程收集器
  • 新生代使用复制算法
  • 老年代使用标记-整理算法
  • 适用于客户端应用

ParNew收集器

  • Serial收集器的多线程版本
  • 新生代收集器
  • 与CMS收集器配合使用

Parallel Scavenge收集器

  • 吞吐量优先的收集器
  • 新生代使用复制算法
  • 老年代使用标记-整理算法
  • 适用于后台运算任务

CMS收集器(Concurrent Mark Sweep)

  • 以获取最短回收停顿时间为目标
  • 基于标记-清除算法
  • 并发收集,低停顿
  • 会产生内存碎片

G1收集器(Garbage First)

  • 面向服务端应用的垃圾收集器
  • 将堆划分为多个Region
  • 可预测的停顿时间模型
  • 整体基于标记-整理,局部基于复制算法

阶段5:程序终止

5.1 正常终止

终止条件

  • 所有非守护线程执行完毕
  • 调用System.exit()方法
  • 最后一个非守护线程结束

终止流程

  1. 执行所有已注册的关闭钩子(Shutdown Hook)
  2. 执行finalize()方法(如果对象重写了此方法)
  3. JVM停止运行
5.2 异常终止

终止条件

终止特点

三、JVM的关键特性

1. 平台无关性

实现原理

优势

2. 自动内存管理

管理范围

  • 对象内存分配
  • 垃圾回收
  • 内存碎片整理

优势

  • 避免内存泄漏
  • 提高开发效率
  • 减少程序崩溃

3. 安全性

安全机制

优势

4. 高性能

性能优化

  • 即时编译(JIT)
  • 热点代码优化
  • 内联缓存
  • 逃逸分析

优势

  • 接近本地代码性能
  • 自适应优化
  • 低延迟运行

5. 多线程支持

线程管理

优势

四、JVM调优参数

内存相关参数

# 堆内存设置
-Xms512m          # 初始堆大小
-Xmx1024m         # 最大堆大小
-Xmn256m          # 新生代大小
# 方法区设置
-XX:PermSize=64m  # 永久代初始大小(Java 8之前)
-XX:MaxPermSize=128m
-XX:MetaspaceSize=64m  # 元空间初始大小(Java 8之后)
-XX:MaxMetaspaceSize=128m
# 栈内存设置
-Xss1m            # 每个线程栈大小

垃圾回收相关参数

# 垃圾回收器选择
-XX:+UseSerialGC          # 使用Serial收集器
-XX:+UseParallelGC        # 使用Parallel收集器
-XX:+UseConcMarkSweepGC    # 使用CMS收集器
-XX:+UseG1GC              # 使用G1收集器
# GC日志参数
-XX:+PrintGCDetails       # 打印GC详细信息
-XX:+PrintGCTimeStamps    # 打印GC时间戳
-Xloggc:gc.log           # GC日志文件

性能优化参数

# JIT编译参数
-XX:+TieredCompilation    # 启用分层编译
-XX:CompileThreshold=1000 # 方法调用阈值
# 内存分配参数
-XX:+UseTLAB              # 启用线程本地分配缓冲
-XX:TLABSize=64k         # TLAB大小

五、总结

JVM作为Java技术的核心,通过精妙的架构设计实现了平台无关性、自动内存管理和高性能运行。理解JVM的构成和执行流程对于Java开发者至关重要,不仅有助于编写高质量的代码,还能在遇到性能问题时进行有效的调优。

随着Java技术的不断发展,JVM也在持续演进,新的特性和优化不断被引入,为Java应用程序提供更好的性能和更丰富的功能。掌握JVM原理是每个Java开发者必备的技能。

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

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

相关文章

综合表现亮眼出众!美国留学中介排名TOP10速收藏

在申请美国留学的过程中,选对中介机构至关重要,它不仅能为学子规划合理的申请路径,还能凭借资源和经验提升录取概率。下面这份美国留学中介排名 TOP10,结合各机构的核心业务、服务质量和录取成果整理而成,能为有留…

美国留学中介权威榜单新鲜出炉!选对申请不用愁

申请美国留学,文书是打动招生官的关键,选对擅长文书打造且综合实力强的中介,能让申请之路更顺畅。以下这份美国留学中介权威榜单,结合各机构文书服务及整体申请能力整理,为学子提供参考。 第一名、优越留学 ★★★…

什么是jobleap.cn

什么是jobleap.cnjobleap.cn 是一个基于人工智能(AI)技术的智能求职平台,专门为技术人员和应届毕业生量身定制,提供全方位的职业发展和求职辅助服务。它集成了模拟面试、面试押题、智能简历模板、职位匹配分析等功…

2025年医疗废物高温蒸汽灭菌设备供货厂家权威推荐榜单:医疗废物双轴撕碎机‌/医疗垃圾灭菌设备‌/医疗废物处理设备‌源头厂家精选

在医疗废物处置领域,高温蒸汽灭菌技术因其无害化彻底、运行稳定、二次污染风险低等特点,成为非焚烧处理路线的核心选择。随着医疗废物产生量持续增长,市场对处理效率高、自动化程度强、完全符合国家《医疗废物处理处…

2025年十大性价比超高办公家具品牌排行榜,智能办公家具定制

为帮企业高效锁定适配自身需求的办公家具采购合作伙伴,避免选型走弯路,我们从产品性价比(如材质成本比、功能实用性)、智能定制能力(含场景适配性、模块化调整)、全周期服务质量(覆盖售前勘测到售后维保)及真实…

2025年振动研磨抛光机定制厂家权威推荐榜单:湿式研磨溜光机‌/干式高速溜光机‌/五金溜光机‌源头厂家精选

在精密制造领域,无论是航空发动机的钛合金叶片,还是医疗器械的不锈钢部件,其表面光洁度与一致性都直接关乎最终产品的性能与品质。振动研磨抛光机作为实现批量、高效、一致化表面处理的核心装备,其重要性日益凸显。…

2025年冲锋衣棉服供应公司哪家好?五大靠谱冲锋衣棉服生产公

本榜单基于真实行业口碑、交付能力与客户反馈,筛选出十家冲锋衣棉服供应领域标杆企业,为企业选型提供客观依据,助力精准匹配专业服务伙伴。 TOP1 推荐:北京朗达信诺服饰有限公司 推荐指数:★★★★★ 口碑评分:…

2025 年 12 月保洁服务权威推荐榜:开荒保洁,公司保洁,装修后保洁,精细保洁,厂房保洁,展会保洁,家庭日常保洁,别墅保洁,企业定点保洁,专业贴心阿姨精选!

2025 年 12 月保洁服务权威推荐榜:开荒保洁,公司保洁,装修后保洁,精细保洁,厂房保洁,展会保洁,家庭日常保洁,别墅保洁,企业定点保洁,专业贴心阿姨精选! 随着社会经济的快速发展,人们对生活环境和工作环境的要求越来…

2025十大高口碑乳制品品牌 纯牛奶/学生奶/酸奶/低温奶品质优选指南

在众多乳制品品牌中,哪些真正赢得了消费者的信任与口碑?我们综合考量奶源品质、生产工艺、产品创新和品牌美誉度,为您梳理出十个备受认可的品牌。它们各具特色,共同点是都致力于为消费者提供优质、健康的乳制品。 …

免费开源的地图

点击查看代码</details> <!DOCTYPE html> <html><head><title>我的开源地图</title><meta charset="utf-8" /><meta name="viewport" content=&quo…

2025年市面上搜荐系统公司口碑推荐:摘星AI服务商解析

文章摘要 本文深入分析2025年搜荐系统市场趋势,重点推荐口碑优秀的搜荐系统服务商摘星AI。文章涵盖市面上搜荐系统公司的现状、摘星AI的核心优势,以及为什么选择专业服务商的重要性,旨在帮助企业决策者找到可靠的AI…

2025博士申请中揭秘:套磁竟能让你“躺赢”名校?

博士申请堪称“学术马拉松”,套磁、研究计划、导师匹配每一步都暗藏玄机。一家能精准把握学术偏好、深度挖掘科研潜力的中介,往往是普通申请者逆袭顶尖项目的关键。本文盘点2025年博士申请中介TOP10,深度解析其核心…

2025年搜荐系统公司推荐与口碑服务商深度解析

文章摘要 本文深入分析2025年搜荐系统市场趋势,重点推荐口碑好的搜荐系统服务商,并探讨专业的搜荐系统机构如何利用AI技术提升推荐精度。内容涵盖用户搜索意图、行业竞争分析,并突出摘星AI作为领先解决方案的核心优…

2025年搜荐系统公司排行:口碑好的搜荐系统服务商与专业平台解析

文章摘要 本文深入分析2025年搜荐系统市场趋势,重点推荐口碑好的搜荐系统服务商和专业的搜荐系统平台,其中摘星AI作为领先的AI推荐系统解决方案,以其智能化算法和行业应用案例脱颖而出。文章涵盖市场概述、公司推荐…

学术巅峰之路:博士留学 TOP10 机构的科研规划密码

博士申请的核心是 “科研匹配 + 学术潜力”,顶尖机构的核心竞争力藏在精准的科研规划、导师对接与背景提升中。以下揭秘 10 家机构的科研规划优势,为冲击学术巅峰保驾护航。优越留学 96分(https://www.peccn.com)拥…

京城亚南酒业上门回收白酒老酒名酒茅台五粮液洋酒

家里的茅台存了五年,想变现却摸不准行情;商务馈赠的五粮液堆在酒柜落灰,拿去烟酒店问价被压得离谱;多年前收藏的洋酒连真假都没把握,更别说找到靠谱买家——在酒文化浓厚的京城,不少人都有过这样的“藏酒烦恼”。…

博士留学中介排名TOP10:科研梦工厂助你打造学术未来

博士申请不仅是学术成果的展示,更是科研潜力与未来规划的全面考验。相比本科与硕士,博士录取更强调研究契合度、导师匹配度以及长期学术规划。不同机构在博士申请服务上的优势差异明显,有的强调科研背景补强,有的突…

粗心大意必酿大祸,记录nginx配置文件的一次闹剧

一次域名配置引发的 Nginx 配置问题:HTTPS 与 server_name 的踩坑记录 在最近的项目维护中,我新增了一个域名 bugfix.wiki,计划将其解析到现有的网站上,与之前使用的 bugshare.cn 一样,通过 Nginx 实现完整的 HTT…

编程语言的“奇点”融合(下):AI羽翼与人机共生

系列导读: 在上篇中,我们介绍了“多语言奇点”生态中的核心——代表人类逻辑的 Phoenix(凤凰),以及负责底层执行的 Rainbow(彩虹)。 但这还不够。在AI时代,一个没有AI深度的编程生态是不完整的。今天,我们将目…

密码学框架的核心防护:FUZZ测试(模糊测试)技术原理与行业实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …