字节码执行引擎

栈帧:
局部变量表:编译时确定大小,slot(一般32bit,可存放reference用于找到对象和类型数据)
连续2slot(64bit,long,double,可以非原子操作,反正这是线程私有的)
实例方法this,参数,局部变量
static方法参数,局部变量
slot可重用,局部变量必须先赋值后使用

操作数栈:编译时确定大小,基于栈(即操作栈)的解释执行引擎

动态连接:指栈帧含一个指向运行时常量池此方法对应的符号/直接引用的指针

返回地址:正常退出(可带返回值),异常退出,返回值压入调用者的操作数栈,pc后移。

invokestatic 静态方法,非虚
invokespecial init,private,父类方法,非虚
invokevirtual final(非虚),其他虚
invokeinterface 虚
invokedynamic
方法调用:指确定方法版本
解析调用:编译期确定好,类加载时符号引用转直接引用,非虚。

分派(dispatch)调用 :编译和运行期共同确定版本
静态分派:编译期,根据(调用者静态类型,参数静态类型,参数个数,多分派)确定方法重载版本
静态分派不确定性,'a’作为参数,可以依次调用char,int,long,Character,Serializable,Object,char…的 重载版本
动态分派:运行期,根据 调用者实际类型(单分派)确定方法重写版本
找到实际类型后不断向上找,并需进行访问权限校验
实现:虚方法表(每个类都有虚方法表,包含所有方法的地址(Object方法也在内),重写方法指向自己类型数据(方法实现的入口地址),未重写指向父类类型数据)

基于栈的指令集,多为零地址指令,依赖操作数栈工作
可移植,不受硬件(寄存器)约束,虚拟机可将hot的数据放于寄存器,代码紧凑(如一个byte对应一个指令)
但是执行慢:
1 指令数量多,大量出入栈
2 栈在内存中,频繁访存也慢
1+1 (iconst_1 iconst_1 iadd istore_0 ) ( mov eax, 1 add eax, 1)

在这里插入图片描述

上图显示执行偏移为2的指令执行情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值