您的位置:首页 > 其它

虚拟机字节码执行引擎

2018-01-22 08:04 169 查看
执行引擎在执行Java代码的时候,可能有解释执行(通过解释器执行)和编译执行(通过即时编译器产生本地代码执行)两种选择,也可能是二者兼备。所有引擎都是一致的:输入的是字节码文件,处理过程是字节码解析的等效过程,输出的是结果。

栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构。它是虚拟机运行时数据区中的虚拟机栈(Virtual Machine Stack)的栈元素。

栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息。每一个方法从调用开始到执行完成的过程,就对应着一个栈帧的在虚拟机栈里面从入栈到出栈的过程。



确定被调用方法的版本,即调用哪一个方法。

1. 解析——静态的

- invokestatic:调用静态方法
- invokespecial:调用实例构造器<init>方法、私有方法和父类方法
- invokevirtual:调用所有的虚方法。但final是非虚方法却用此调用
- invokeinterface:调用接口方法,会在运行时再确定一个实现此接口的对象。


2. 分派

静态分派——重载方法

在编译阶段,Java编译器根据参数的静态类型决定调用哪个方法。所有依赖静态分派类型来定位方法执行版本的分派动作,都成为静态分派。

优先级:准确类型 > 自动装箱类 > 自动装箱类接口 > 自动装箱类父类 > 可变参数





- 动态分派——重写方法

把运行期根据实际类型确定方法的分派过程成为动态分派。







- 单分派和多分派

单分派——动态分派 多分派是静态分派

<
4000
p>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: