JVM引擎执行一个方法时,需要确定一个方法该执行的版本,页就是需要将字节码文件中的符号引用转换成内存中具体方法的地址。
方法调用源代码
是写在java源代码中的方法调用信息,转换成字节码时,需要用一个字符串也就是符号引用来表示,对于方法重载的情况,这个时候需要选择一个方法表示当前代码调用的方法。
符号引用
是用一个字符串表示一个方法。存储在方法区的常量池中。
直接引用
运行阶段才知道的方法在内存中的入口地址。
C++在编译时链接,确定直接引用。
Java是在解析阶段和运行阶段才将符号引用转换成直接引用。
编译阶段
将一个方法的符号引用存储到字节码中,这时候可能需要将重载的多个方法中找到一个确定的。
加载(解析)阶段
将非虚方法的符号引用转换成直接引用。
运行阶段
将虚方法的符号引用转换成直接引用。
非虚方法
在编译阶段就知道用哪个版本的方法
静态方法 invokestatic
私有方法 invokespecial
构造方法 invokespecial
父类方法 invokespecial
Final方法 invokevirtual
只有一个版本的方法。
有多个版本,但是方法重载,在编译阶段可以确定一个的方法。
虚方法
在运行时才确定执行哪个版本的方法,这里和多态对应。
invokevirtual
父类,子类有多个版本的方法。
父类,子类有多个版本,同时又存在重载的方法。
多态
方法重载
同一个类内,方法名,参数列表不同的多个版本的方法。
方法重写
父类和子类中,子类重写了父类的同名方法。当用父类声明一个变量时,调用该方法名称,不确定使用的是哪个版本的方法。
静态分派
依赖方法所属类确定查找范围,依赖参数类型和参数值的静态类型来确定调用版本的办法。
Class Test{
sayHallo(Human person);
sayHello(Man person);
}
Human person = new Man();
sayHello(person);
调用的是Human那个方法。
静态分派对应方法重载。
静态分派是在编译阶段完成的,帮忙从代码中的方法调用确定了一个调用方法的符号引用。
因为依赖多个因素,所以也称为静态多元素分派
动态分派
依赖方法调用对象的动态类型来确定调用版本的办法。
Class Human{sayHello(){};}
Class Man extends Human{sayHello();}
Human person = new Man();
Person.sayHello();
调用的是Man中的方法。
动态分派对应方法重写。
动态分派是在运行期完成的。
因为依赖单个因素,所以也称为动态单元素分派。
这里的分派只是一个办法,并不是说只能用于虚方法,用于运行期确定方法版本。
动态分派可能是。
静态分派也可用于非虚方法。
一个方法办法的确定可能既存在重载也存在重写,静态分派,动态分派都在使用。
既需要静态分派也需要动态分派的情况,先是编译阶段的静态分派,然后再将符合引用到运行期进行动态分派。也就是先处理重载,后处理重写。
class Father {
public void sayHello(Human person);
public void sayHello(Man person);
}
class Son extends Father{
public void sayHello(Human person);
public void sayHello(Man person);
}
Father object = new Son();
Human person = new Man();
object.sayHello(person);
第一步,编译阶段,进行静态分派,在Father的范围内,找参数类型和参数值的静态类型一致的方法,选择了Father的sayHello(Human),将该方法的符号引用存储到了字节码中。
第二步,运行阶段,进行动态分派,根据调研对象的实际类型来找方法,选择了Son的sayHello(Human),确定了该方法的直接引用。
静态类型
动态类型
Human man = new Man();
相关推荐
在运行时,每个Java线程都对应一个独立的虚拟机执行引擎实例,从线程启动到结束,它一直在执行字节码或本地方法。除了用户程序的线程,JVM实现还可能包含一些后台线程,如垃圾收集器,这些线程不需要直接对应执行...
在IT安全领域,虚拟机脱壳引擎是一种用于分析和解除软件保护层的工具,特别是针对那些使用了虚拟机技术来隐藏代码真实行为的恶意软件。本文将深入探讨虚拟机脱壳引擎的工作原理、相关概念以及如何使用提供的h头文件...
JVM分为多个组件,如类装载器、运行时数据区、执行引擎、本地方法接口和本地库。在描述中提到的`CodeInterpreter.cpp`可能就是指JVM中的解释器部分,用于将字节码转化为机器指令。 2. **字节码执行**:Java源代码被...
Java 虚拟机的体系结构由多个子系统组成,包括类加载器子系统、执行引擎、数据区等。类加载器子系统负责加载程序中的类型(类和接口),并赋予唯一的名字。执行引擎负责执行被加载类中包含的指令。数据区中保存了...
执行引擎是虚拟机的核心组件之一,负责解释字节码指令为机器码并执行。它包括一个指令集,包含了所有JVM可以执行的指令。这些指令用于加载、存储、操作和控制虚拟机栈的栈帧。指令集分为多个类别,比如加载和存储...
MiniJavaVM 的设计主要分为五个部分:类加载器、执行引擎、内存管理、方法调用和异常处理。 类加载器 类加载器是 JVM 中的一个重要组件,它负责加载 Java 类文件并将其转换为 JVM 可以识别的格式。在 MiniJavaVM ...
构成要素包括虚拟机总体框架、命令参数解析模块、类的装载和解析模块、内存管理模块、执行引擎模块、方法调用模块和异常处理模块等。 第三章虚拟机框架的实现 虚拟机框架的实现分为三个主要部分:JVM 工程、JavaVM...
3. **执行引擎** - 负责执行字节码,提供解释执行和即时编译两种模式。 #### 三、运行时数据区详解 ##### 1. 方法区(Method Area) - 存储每类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量池等...
Java虚拟机指令集是虚拟机执行的基本操作单元,每条指令对应一个特定的操作,如加载和存储变量、算术运算、控制流程、对象创建和方法调用等。这些指令是无操作数的,它们的参数通常在操作数栈上找到。Java SE 7版的...
Java虚拟机规范详细描述了JVM的工作原理,包括它的体系结构、数据类型、指令集、执行引擎、内存模型以及异常处理机制等等。 1. JVM体系结构:JVM包括类加载器、运行时数据区、执行引擎、本地接口和垃圾回收器。类...
类装载器负责加载类文件,运行时数据区存储程序运行时的信息,执行引擎执行字节码,本地方法接口用于调用非Java语言实现的函数,本地库则包含这些函数的具体实现。 2. **字节码与类文件结构** Java源代码被编译成...
在虚拟机规范中制定了虚拟机字节码执行引擎的概念模型,这个概念模型称为各种虚拟机执行引擎的统一外观. 在不同的虚拟机实现里,执行引擎在执行 java 代码的时候,可能会解释执行和编译执行等,但是从外观上来看,...
栈帧是JVM执行引擎中方法调用和执行的基础数据结构,存在于每个线程的虚拟机栈中。栈帧包含了以下几个主要部分: 1. **局部变量表**:存储方法参数和局部变量。其容量在编译时已经确定,并以Slot为基本单位。Slot的...
- **执行引擎**:解释执行或编译为机器码执行字节码指令。 - **本地接口**:提供与操作系统交互的接口。 ##### 1.3 MiniJavaVM的功能 MiniJavaVM是一个简化的Java虚拟机实现,主要功能包括: - 类的装载与解析:...
3. 执行引擎:负责解释和执行字节码,包括解释器和JIT(Just-In-Time)编译器。解释器逐条执行字节码,而JIT编译器将热点代码编译成本地机器码,以提高执行效率。 4. 内存管理:主要涉及垃圾收集机制,自动回收不再...
它是基于栈的执行引擎的核心组件,与计算过程紧密相关。 3. 动态链接(Dynamic Linking):这部分存储了方法调用过程中的符号引用,使得虚拟机能够找到被调用方法的具体实现。 4. 方法返回地址(Return Address)...
JVM主要由以下几个部分组成:类装载器、运行时数据区、执行引擎、本地方法接口和本地库。类装载器是JVM的重要组成部分,它的任务是将Java类加载到内存中,以便执行。 1. 类装载器(ClassLoader): 类装载器分为...
JVM的执行引擎还包括运行时数据区,如程序计数器、虚拟机栈、本地方法栈、堆和方法区。这些区域各自负责不同的功能,如程序计数器记录下一条要执行的字节码指令,虚拟机栈处理方法调用,本地方法栈服务于native方法...
首先,我们要了解JVM的结构,它主要包括类装载器、运行时数据区、执行引擎、本地方法接口和本地方法库。类装载器负责加载类文件,运行时数据区包括堆、栈、方法区等,执行引擎则是解释或编译字节码并执行的组件。...
其中,类装载器负责加载类文件,运行时数据区存储线程的工作数据,执行引擎解析并执行字节码,本地方法接口允许JVM调用非Java语言实现的函数,而本地库则包含操作系统特定的功能。 在性能优化方面,Java虚拟机实现...