深入理解JAVA虚拟机-虚拟机字节码执行引擎

引擎(Engine)是电子平台上开发程序或系统的核心组件。利用引擎,开发者可迅速建立、铺设程序所需的功能,或利用其辅助程序的运转。一般而言,引擎是一个程序或一套系统的支持部分。

以上是引擎的百度百科定义,在我看来,虚拟机字节码执行引擎的含义是:一套基于字节码-输出的概念模型,它屏蔽了虚拟机在内部选择编译和优化的部分,尽可能让你理解它的部件以及如何连接运作起来的,尽管内部比这个更复杂。

首先来看看局部变量表,以前我一直没理清它与虚拟机栈的关系(其实现在不是太清楚),有个困惑了我很久的问题,就是一个参数大于等于2的方法,例如fun(int i1, double i2) 在调用的时候局部变量是否进出栈?以什么顺序进出?事实上,局部变量是保存在虚拟机栈中的,但是并非从调用的时候开始就一直存在(可能存在反复调用以及调用顺序的差异)。在编译时javac已经明白fun存在多少个参数、剩余多少个局部变量,并将这些属性length写入CODE(类方法的class的一部分)中,在虚拟机读取的时候为它创建length大小的局部变量表,这是一块在栈中另开的内存空间,并不在栈帧中,并以索引下标代指(因为length是固定的,依照顺序就知道索引代表哪个局部变量),而且局部变量表中的是实际引用而非符号引用(可以看成内存指针)。

 关于静态分派和动态分派的部分,有点绕,简单概括,当调用方法的对象已经确定的情况下,适用静态分派,也就是方法的重载,通过签名来判别适用哪个方法,签名中的数据类型是以静态类型而非实际类型判定的。如Human man = new Man();参数man的数据类型是静态类型Human而非实际类型Man。而动态分派,是调用对象未知,例如一个未知具体实际类型的父类Human  human调用了方法function(),这个human可能指向子类Man或者Women,只有在执行到这一步的时候,虚拟机查看栈顶的human实际类型到底是哪一种才能知道是哪种对象在调用,这也就是方法重写的实现原理。

最后,虚拟机是基于栈的指令集架构(ISA),而非现在更常用的X86指令集架构,可以看成在寄存器基础上虚拟出栈结构,使得虚拟机可以忽略具体的寄存器指令实现过程,仅提供接口,更抽象,可移植,但是相对效率低。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值