`

虚拟机执行引擎如何确定调用方法版本

    博客分类:
  • JAVA
 
阅读更多

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();

0
0
分享到:
评论

相关推荐

    虚拟机运行时栈帧的结构

    在虚拟机规范中制定了虚拟机字节码执行引擎的概念模型,这个概念模型称为各种虚拟机执行引擎的统一外观. 在不同的虚拟机实现里,执行引擎在执行 java 代码的时候,可能会解释执行和编译执行等,但是从外观上来看,...

    深入Java虚拟机(原书第2版).pdf【附光盘内容】

     本书共分20章,第1-4章解释了java虚拟机的体系结构,包括java栈、堆、方法区、执行引擎等;第5-20章深入描述了java技术的内部细节,包括垃圾收集、java安全模型、java的连接模型和动态扩展机制、class文件、运算及...

    深入Java虚拟机

    5.3.10 执行引擎 5.3.11 本地方法接口 5.4 真实机器 5.5 一个模拟:“Eternal Math” 5.6 随书光盘 5.7 资源页 第6章 Java class文件 6.1 Java class文件是什么 6.2 class文件的内容 6.3 特殊...

    Java虚拟机

    第三部分 虚拟机执行子系统 第6章 类文件结构 6.1 概述 6.2 无关性的基石 6.3 Class类文件的结构 6.3.1 魔数与Class文件的版本 6.3.2 常量池 6.3.3 访问标志 6.3.4 类索引、父类索引与接口索引集合 6.3.5 ...

    一个Java虚拟机的设计和实现

    本文叙述了Java虚拟机(JVM...在探讨虚拟机的设计过程中详细介绍了MiniJavaVM虚拟机各部分的设计,包括类的装载和解析,内存管理,执行引擎,方法调用和异常处理部分。最后通过测试MiniJavaVM来验证设计和实现的正确性。

    深入java虚拟机第二版

    5.3.10 执行引擎 5.3.11 本地方法接口 5.4 真实机器 5.5 一个模拟:“Eternal Math” 5.6 随书光盘 5.7 资源页 第6章 Java class文件 6.1 Java class文件是什么 6.2 class文件的内容 6.3 特殊字符串 ...

    Java虚拟机(JVM)面试题(总结最全面的面试题!!!)

    Java虚拟机(JVM)面试题(总结最全面的面试题!...能不能解释一下方法区(重点理解)什么是JVM字节码执行引擎你听过直接内存吗?知道垃圾收集系统吗?堆栈的区别是什么?深拷贝和浅拷贝Java会存在内存泄漏吗?请说 收

    深入JAVA虚拟机(第2版)

    5.3.10 执行引擎 5.3.11 本地方法接口 5.4 真实机器 5.5 一个模拟:“Eternal Math” 5.6 随书光盘 5.7 资源页 第6章 Java class文件 6.1 Java class文件是什么 6.2 class文件的内容 6.3 特殊...

    深入java虚拟机中文第2版

    本书共分20章,第1-4章解释了Java虚拟机的体系结构,包括Java栈、堆、方法区、执行引擎等;第5-20章深入描述了Java技术的内部细节,包括垃圾收集、Java安全模型、Java的连接模型和动态扩展机制、class文件、运算及...

    深入理解Java虚拟机视频教程(jvm性能调优+内存模型+虚拟机原理)视频教程

    视频目录 第1节说在前面的话 [免费观看] 00:05:07分钟 | 第2节整个部分要讲的内容说明 [免费观看] 00:06:58分钟 | 第3节环境搭建以及jdk,...第104节字节码执行引擎小结00:03:38分钟 | 第105节总结与回顾00:10:55分钟

    深入理解_Java_虚拟机 JVM_高级特性与最佳实践

    / 199 8.2.2 操作数栈 / 204 8.2.3 动态连接 / 206 8.2.4 方法返回地址 / 206 8.2.5 附加信息 / 207 8.3 方法调用 / 207 8.3.1 解析 / 207 8.3.2 分派 / 209 8.4 基于栈的字节码解释执行引擎 / 221 8.4.1 ...

    深入理解JVM内存结构及运行原理全套视频加资料.txt

     第104讲 字节码执行引擎小结 00:03:38  第105讲 总结与回顾 00:10:55  第106讲 happens-before简单概述 00:15:17  第107讲 重排序问题 00:23:19  第108讲 锁的内存语义 00:13:54  第109讲 volatile的...

    SquirrelJME:SquirrelJME是用于嵌入式和物联网设备的Java ME 8虚拟机。 它的最终目标是与Java ME标准兼容99.9%

    松鼠 ... 有一个用C编写的执行引擎,它提供了一种轻量级的代码执行方法。 另外,在SquirrelJME和RetroArch之间有一个端口,该端口可以播放旧版的J2ME软件和专为翻盖手机设计的游戏。 版权所有(C)

    加壳工具-Virbox Protector standalone

    性能分析:智能分析引擎,一键分析各个函数模块调用的次数 资源加密:可保护Unity、UE4开发的软件中资源被提取 支持多种开发语言:多种开发语言加壳支持 源码级保护:保护到汇编级别,c#保护IL级别 多平台支持:支持...

    超级有影响力霸气的Java面试题大全文档

    finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。 16、sleep() 和 wait() 有什么区别? sleep是线程类(Thread)...

    :rocket:与PHP源代码相关的精选资源精选清单-PHP开发

    :rocket:与PHP源代码相关的精选资源精选列表Awesome PHP源代码与PHP源代码相关精选的精选内容目录文章书籍讨论播客文章PHP虚拟机Zend执行引擎函数调用书籍内部书籍讨论Externals.io RFC播客PHP内部新闻

    java 面试题 总结

    finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。 13、sleep() 和 wait() 有什么区别? sleep是线程类(Thread)的...

    java7rt.jar源码-Java_JVM:这是我的JavaJVM学习笔记

    执行引擎: (字节)解释器 + JIT(java即时编译器) 前者是用 PC计数器 来依次编译每一行代码解释为本地机器指令; 后者是通过 寻找热点代码 进行即时编译为本地机器指令; GC: 垃圾回收器 主要的三款商用虚拟机JVM: 1...

Global site tag (gtag.js) - Google Analytics