虚拟机字节码执行引擎
创始人
2024-11-15 03:33:05
0

代码编译的结果从本地机器码转换为字节码,是存储格式发展的一小步,却是编程语言发展的一大步。
虚拟机的执行引擎是依托于物理机的执行引擎的,物理机的执行引擎是直接建立在处理器,缓存,指令集和操作系统层面的,而虚拟机的执行引擎则是由软件自行实现的。

运行时栈帧结构

java虚拟机以方法作为最基本的执行单元,栈帧则是用于支持虚拟机进行方法调用,执行和返回的基本单位的数据结构。
每一个栈帧都包括了局部变量表,操作数栈,动态连接和方法返回地址等信息。
一个线程同一时刻,对于执行引擎,只针对执行栈顶方法(当前栈帧,当前方法),其所有的字节码都是针对当前栈帧进行操作。

局部变量表

存放方法内部的变量,在编译为class文件时,就已经确定好了空间。

操作数栈

同局部变量表一样,其最大深度也在编译时写入到了class文件的Code属性中的max_stacks数据项中了。
在方法初,方法的操作数栈是空的,在方法执行过程中会有操作数被压入栈中,然后出栈计算等。比如两个int被压入,取出乘后再压入。

方法返回

有两种方式:

  1. 方法返回值给调用者
  2. 遇到异常,并且这个异常没有在方法体内妥善处理,没有找到匹配的异常处理器。

方法调用

java的class文件编译过程中不包含连接,一切调用在class文件中存储的都是符号引用,而不是地址入口。
方法的符号引用存储在.class文件的常量池(Constant Pool)中

0: getstatic     #4  // Field java/lang/System.out:Ljava/io/PrintStream; 3: ldc           #6  // String "Hello, world!" 5: invokevirtual #5  // Method java/io/PrintStream.println:(Ljava/lang/String;)V 

这里的#4, #5, #6分别引用常量池中的第4、第5和第6个条目。这些条目包含了对System.out, println方法和字符串常量的符号引用。

编译后的.class文件中的常量池可能包含如下条目(以简化形式表示):

CONSTANT_Class_info: 指向类Example CONSTANT_Methodref_info: 指向Example.sayHello:()V CONSTANT_Class_info: 指向类java/lang/System CONSTANT_Fieldref_info: 指向java/lang/System.out:Ljava/io/PrintStream; CONSTANT_Methodref_info: 指向java/io/PrintStream.println:(Ljava/lang/String;)V CONSTANT_String_info: 包含字符串"Hello, world!" 

方法调用阶段唯一的任务就是确定被调用方法的版本

解析:编译期可知,运行期不可变(非虚方法),在编译时就将符号引用转换为直接引用

这些符号引用,在类加载的解析阶段,会将其中的一部分符号引用转换为直接引用,这类可以直接转换的方法的版本在编译时刻就确定下来了,这类方法调用是:解析
具体方法:静态方法(与类直接相关),私有方法(外部不可访问),都不能被重写,实例构造器,final方法。

静态分派(在编译时发生)重载

引用类型(外观类型,声明类型)
实际类型(运行时类型)
重载会使用引用类型,而不是实际类型。

分派:由jvm确认重写方法

Human man=new Man(); Human woman=new Woman(); man.sayHello(); woman.sayHello(); 
从子类到父类,从下往上判断符合的方法,返回方法地址

在动态调用重写的方法中,首先是建立woman和man的内存空间,调用man和woman的实例构造器,将这两个引用放到局部变量表的变量槽中,将两个对象引用压到栈顶,执行方法调用,找到栈顶对象的实际类型,如果在这个类中有合适的方法并且访问权限相符,返回这个方法的地址,否则,按照继承关系从下往上依次对这个类的各个父类进行第二步的搜索和验证,如果通过则返回其符合的父类地址

字段没有多态性

相关内容

热门资讯

针对!微信新众游辅助(辅助)果... 针对!微信新众游辅助(辅助)果然是真的有辅助教程(有挂细节)1、游戏颠覆性的策略玩法,独创攻略技巧玩...
黑科技辅助挂!微信牵手跑的快辅... 黑科技辅助挂!微信牵手跑的快辅助(辅助)竟然真的是有辅助器(今日头条)小薇(辅助器软件下载)致您一封...
据公告内容!乐酷大厅怎么安装(... 据公告内容!乐酷大厅怎么安装(辅助)一直是有辅助软件(真是有挂)1、完成乐酷大厅怎么安装有辅助插件,...
今年以来!新超圣辅助靠谱不(辅... 今年以来!新超圣辅助靠谱不(辅助)好像是真的有辅助教程(有挂神器)1、全新机制【新超圣辅助靠谱不ai...
据权威媒体报道!老友赣州麻将破... 据权威媒体报道!老友赣州麻将破解版(辅助)果然是有辅助神器(有挂猫腻)1、玩家可以在老友赣州麻将破解...
此事引发网友热议!闲聚鱼虾蟹软... 此事引发网友热议!闲聚鱼虾蟹软件脚本(辅助)真是真的是有辅助挂(有挂技术)1、用户打开应用后不用登录...
事发当天!边锋干瞪眼辅助器(辅... 事发当天!边锋干瞪眼辅助器(辅助)真是存在有辅助方法(有挂实锤)1、边锋干瞪眼辅助器免费辅助多个强度...
为了进一步!欢乐联盟免费辅助(... 为了进一步!欢乐联盟免费辅助(辅助)一直是有辅助软件(有挂助手)运欢乐联盟免费辅助辅助工具,进入游戏...
复盘辅助挂!和和营口辅助(辅助... 复盘辅助挂!和和营口辅助(辅助)果然是真的有辅助器(今日头条)和和营口辅助是不是有人用挂微扑克wpk...
技巧辅助挂!极速摇一摇鱼虾蟹辅... 技巧辅助挂!极速摇一摇鱼虾蟹辅助(辅助)一贯确实有辅助软件(有挂神器)极速摇一摇鱼虾蟹辅助透视方法中...