首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
01 | Java代码是怎么运行的?
02 | Java的基本类型
03 | Java虚拟机是如何加载Java类的?
04 | JVM是如何执行方法调用的?(上)
05 | JVM是如何执行方法调用的?(下)
06 | JVM是如何处理异常的?
07 | JVM是如何实现反射的?
08 | JVM是怎么实现invokedynamic的?(上)
09 | JVM是怎么实现invokedynamic的?(下)
10 | Java对象的内存布局
11 | 垃圾回收(上)
12 | 垃圾回收(下)
13 | Java内存模型
14 | Java虚拟机是怎么实现synchronized的?
15 | Java语法糖与Java编译器
16 | 即时编译(上)
17 | 即时编译(下)
18 | 即时编译器的中间表达形式
19 | Java字节码(基础篇)
20 | 方法内联(上)
21 | 方法内联(下)
22 | HotSpot虚拟机的intrinsic
23 | 逃逸分析
24 | 字段访问相关优化
25 | 循环优化
26 | 向量化
27 | 注解处理器
28 | 基准测试框架JMH(上)
29 | 基准测试框架JMH(下)
30 | Java虚拟机的监控及诊断工具(命令行篇)
31 | Java虚拟机的监控及诊断工具(GUI篇)
32 | JNI的运行机制
33 | Java Agent与字节码注入
34 | Graal:用Java编译Java
35 | Truffle:语言实现框架
36 | SubstrateVM:AOT编译框架
当前位置:
首页>>
技术小册>>
深入拆解 Java 虚拟机
小册名称:深入拆解 Java 虚拟机
### 04 | JVM是如何执行方法调用的?(上) 在深入探讨Java虚拟机(JVM)如何执行方法调用之前,我们首先需要理解JVM的整体架构以及方法调用在Java程序执行流程中的位置。Java虚拟机作为Java语言的运行环境,负责将Java字节码转换为机器码执行,其中方法调用是Java程序中最频繁的操作之一,也是实现面向对象编程中多态、继承等特性的关键机制。本章将分为几个部分,逐步揭开JVM执行方法调用的神秘面纱。 #### 一、JVM架构概览 在深入讨论方法调用之前,简要回顾JVM的架构是有益的。JVM主要由类加载器子系统、运行时数据区、执行引擎、本地接口以及垃圾收集器几大部分组成。其中,执行引擎是负责执行字节码指令的核心组件,而方法调用的执行正是执行引擎的重要职责之一。 - **类加载器子系统**:负责将Java类的字节码文件加载到JVM中,并转换为运行时数据结构(如类对象、接口对象等),这些结构被存储在方法区(或元空间)中。 - **运行时数据区**:包括方法区、堆、栈(包括虚拟机栈和本地方法栈)、程序计数器以及直接内存等,是JVM在执行Java程序时使用的内存区域。 - **执行引擎**:读取、解析并执行字节码指令,实现方法的调用与执行。 - **本地接口**:提供JVM与其他语言编写的应用程序或库交互的桥梁。 - **垃圾收集器**:负责自动回收不再使用的内存空间,避免内存泄露和溢出。 #### 二、方法调用的基本概念 在Java中,方法调用是对象间交互的主要方式,也是实现封装、继承和多态等面向对象特性的基础。方法调用可以分为静态方法调用和实例方法调用两大类,它们在JVM中的处理机制有所不同。 - **静态方法调用**:直接通过类名调用,不涉及对象的创建,因此其解析和调用过程相对简单。静态方法属于类,而非类的实例,因此它们的调用不依赖于具体的对象实例。 - **实例方法调用**:通过对象实例调用,涉及对象的创建和方法的动态绑定(多态)。实例方法的调用依赖于具体的对象实例,且可能涉及虚方法的调用,即根据对象的实际类型而非声明类型来决定调用哪个方法。 #### 三、方法调用的过程(上):静态方法调用 静态方法调用因其不涉及对象的动态绑定,其执行过程相对直接和简单。下面,我们将详细解析静态方法调用的执行流程。 ##### 1. 符号引用解析 当Java代码编译成字节码后,方法调用在字节码中表现为对方法符号引用的引用。在执行阶段,JVM需要将这些符号引用解析为直接引用(即内存地址),才能执行实际的方法调用。对于静态方法,其符号引用解析主要发生在类加载阶段,由类加载器子系统完成。 - **解析过程**:首先,JVM通过类名定位到对应的类对象;然后,在类对象的方法表中查找对应的方法描述符(包括方法名和描述符,描述符用于描述方法的参数类型和返回类型),找到后将其转换为方法区(或元空间)中该方法的具体实现(即直接引用)。 ##### 2. 方法调用执行 解析得到直接引用后,JVM通过执行引擎执行方法调用。对于静态方法,由于其不依赖于对象实例,调用过程相对简单: - **参数传递**:JVM按照方法描述符的要求,将调用者提供的参数值压入操作数栈(对于Java虚拟机栈)。 - **方法执行**:通过直接引用定位到方法的具体实现,执行引擎根据方法体中的字节码指令,从操作数栈中取出参数,执行方法体内的逻辑,并将结果(如果有的话)存回操作数栈或返回给调用者。 - **返回值处理**:如果方法有返回值,JVM会将返回值从操作数栈中取出,并返回给调用者。如果方法没有返回值(即void类型),则直接返回。 #### 四、方法调用的性能优化 尽管静态方法调用的过程相对简单,但在实际应用中,JVM还通过一系列优化技术来提高方法调用的性能,如: - **即时编译(JIT)**:JVM会将热点代码(即频繁执行的方法)编译成机器码,以提高执行效率。对于静态方法,由于其不依赖于对象实例,更容易被识别为热点代码并进行编译优化。 - **内联优化**:JVM会将频繁调用的方法体直接嵌入到调用点处,减少方法调用的开销。对于静态方法,由于其不会改变对象的状态,因此更容易成为内联优化的候选者。 #### 五、总结与展望(上) 本章主要探讨了JVM中静态方法调用的执行过程,包括符号引用的解析、方法调用的执行以及相关的性能优化技术。静态方法调用因其不涉及对象的动态绑定,执行过程相对简单直接。然而,Java程序的复杂性和多样性远不止于此,实例方法的调用,特别是涉及虚方法调用的情况,其执行过程将更加复杂和有趣。在下一章节中,我们将深入剖析JVM如何执行实例方法调用,特别是虚方法的调用机制,以及JVM如何通过各种优化技术来提升方法调用的性能。 通过本章的学习,读者应该对JVM中静态方法调用的基本流程和原理有了较为清晰的认识,为后续学习实例方法调用和多态等高级特性打下了坚实的基础。同时,也期待读者能够继续探索JVM的奥秘,深入理解Java语言的运行机制。
上一篇:
03 | Java虚拟机是如何加载Java类的?
下一篇:
05 | JVM是如何执行方法调用的?(下)
该分类下的相关小册推荐:
Java必知必会-JDBC
Java语言基础11-Java中的泛型
SpringBoot合辑-高级篇
Mybatis合辑3-Mybatis动态SQL
深入理解Java虚拟机
Java语言基础16-JDK8 新特性
Java性能调优实战
Java语言基础13-类的加载和反射
Java语言基础14-枚举和注解
Mybatis合辑4-Mybatis缓存机制
Mybatis合辑1-Mybatis基础入门
经典设计模式Java版