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

字段没有多态性

相关内容

热门资讯

二分钟有挂!wepoker免费... 二分钟有挂!wepoker免费钻石(透视底牌)详细辅助软件(都是是有挂)1、许多玩家不知道wepok...
7分钟设置抽水!aa poke... 7分钟设置抽水!aa poker透视软件,aapoker辅助器是真的吗,详细教程(有挂教程)一、aa...
六分钟开透视!wepoker有... 六分钟开透视!wepoker有没有挂(透视底牌)详细辅助下载(一直真的是有挂);1、超多福利:超高返...
8分钟辅助!aapoker辅助... 8分钟辅助!aapoker辅助器是真的吗(透视脚本)详细辅助下载(真是是真的有挂);1、下载好辅助软...
五分钟私人局透视!wepoke... 五分钟私人局透视!wepoker免费脚本咨询(透视底牌)详细辅助作弊(真是是有挂)1、任何wepok...
2分钟公共底牌!aapoker... 2分钟公共底牌!aapoker透视脚本下载(透视脚本)详细辅助器(原来真的是有挂)1)aapoker...
两分钟轻量版辅助!wepoke... 两分钟轻量版辅助!wepoker究竟有没有透视(透视底牌)详细辅助app(一直是有挂)1)辅助挂:进...
6分钟能控制牌!aa poke... 6分钟能控制牌!aa poker辅助,aapoker怎么开辅助器,详细教程(有挂脚本);1、上手简单...
一分钟俱乐部!wepoker辅... 一分钟俱乐部!wepoker辅助器,wepoker可以透视码,详细教程(有挂方法);1、完成wepo...
5分钟透视脚本下载!aapok... 5分钟透视脚本下载!aapoker安装包怎么使用,aapoker辅助工具安全吗,详细教程(有挂秘籍)...