写点什么

JVM 方法调用

作者:技术小生
  • 2022 年 7 月 24 日
  • 本文字数:783 字

    阅读完需:约 3 分钟

JVM方法调用

JVM 对于方法的优化处理

Java 识别重载方法

  • 在不考虑对基本类型自动拆装箱,以及可变长参数的情况下,选取重载方法。

  • 如果 1 没有找到,那么在允许自动拆装箱,但不允许可变长参数的情况下,选取重载方法。

  • 如果 2 也没有找到,那么在允许自动拆装箱以及可变长参数的情况下,选取重载方法

  • 如果 Java 同时找到多个适配的方法,那么它会选择其中最为贴切的一个,而决定贴切程度的关键就是形式参数类型的继承关系。

JVM 识别方法

JVM 识别方法: 类名 + 方法名 + 方法描述符(方法的参数类型+返回类型)


静态绑定:JVM 在解析时,便能够直接识别目标方法

动态绑定:JVM 在运行过程中,根据调用者的动态类型来识别目标方法


Java 字节码中与调用相关的指令:

  • invokestatic:用于调用静态方法

  • invokespecial:用于调用私有实例方法、构造器、以及使用 super 关键字调用ß私有实例方法或构造器,和所实现接口的默认方法

  • invokevirtual:用于调用非私有实例方法

  • invokeinterface:用于调用接口方法

  • invokedynamic:用于调用动态方法


如果虚拟机能够确定目标方法有且仅有一个,目标方法被标记为 final,那么可以不通过动态类型,直接静态绑定,确定目标方法。

在编译过程中,JVM 会暂时用符号引用来表示目标方法。符号引用包括目标方法的类或接口名、方法名以及方法描述符。

虚方法调用过程

虚方法调用=invokevirtual + invokeinterface

动态绑定实现原理 核心就是方法表

解释执行

方法表:子类方法表中包含父类方法表中的所有方法的索引;子类方法在方法表中的索引值,与它所重写的父类方法的索引值相同。

即时编译

内联缓存:能够缓存虚方法调用中调用者的动态类型,以及该类型所对应的目标方法。在之后的执行过程中,如果碰到已缓存的类型,内联缓存会直接调用该类型所对应的目标方法;否则,退化成使用基于方法表的动态绑定。

方法内联:在编译过程中,遇到方法调用时,将目标方法的方法体纳入编译范围内,并取代原方法调用的优化手段。

发布于: 3 小时前阅读数: 15
用户头像

技术小生

关注

业务应用架构专家 2019.10.08 加入

主要负责公司内部系统的应用架构设计与落地。擅长Java语言开发,熟悉Python、Shell等。精通K8S等云原生相关技术。

评论

发布
暂无评论
JVM方法调用_JVM_技术小生_InfoQ写作社区