虚拟机字节码执行引擎
创始人
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的实例构造器,将这两个引用放到局部变量表的变量槽中,将两个对象引用压到栈顶,执行方法调用,找到栈顶对象的实际类型,如果在这个类中有合适的方法并且访问权限相符,返回这个方法的地址,否则,按照继承关系从下往上依次对这个类的各个父类进行第二步的搜索和验证,如果通过则返回其符合的父类地址

字段没有多态性

相关内容

热门资讯

2026版教程!红龙poker... 2026版教程!红龙poker作必弊指令,德扑圈透视挂(透视)原来是有辅助神器(哔哩哔哩)1、不需要...
八分钟了解!小程序游戏辅助必赢... 八分钟了解!小程序游戏辅助必赢(辅助)微乐天津麻将开挂辅助插件-好像真的有脚本1、小程序游戏辅助必赢...
据了解!云扑克有透视吗,德普之... 据了解!云扑克有透视吗,德普之星透视辅助(透视)果然是有辅助挂(哔哩哔哩)一、云扑克有透视吗游戏安装...
第八分钟了解!真人天天途游破解... 第八分钟了解!真人天天途游破解安装包(辅助)正版新圣游开挂辅助安装-好像是真的app第八分钟了解!真...
透视有挂!红龙poker辅助工... 透视有挂!红龙poker辅助工具,德普之星透视辅助(透视)确实存在有辅助挂(哔哩哔哩)1、许多玩家不...
第四分钟了解!隶属茶苑苹果手机... 第四分钟了解!隶属茶苑苹果手机辅助(辅助)边锋老友文登麻将开挂辅助软件-真是是真的修改器1、每一步都...
第三方辅助!wepoker透视... 第三方辅助!wepoker透视有吗,德普之星辅助器怎么用(透视)切实真的是有辅助脚本(哔哩哔哩)1)...
3分钟了解!牛总管一定要牛辅助... 3分钟了解!牛总管一定要牛辅助(辅助)TX阿城棋牌开挂辅助脚本-本来真的有神器1、3分钟了解!牛总管...
今天上午!竞技联盟辅助插件,德... 今天上午!竞技联盟辅助插件,德扑圈有透视吗(透视)都是真的是有辅助攻略(哔哩哔哩)1、这是跨平台的竞...
8分钟了解!福建天天开心辅助软... 8分钟了解!福建天天开心辅助软件大全(辅助)天天潜游开挂辅助辅助器-切实有挂安装福建天天开心辅助软件...