JVM学习笔记6:字节码执行引擎

一 概述

        JVM的字节码执行引擎,功能基本就是输入字节码文件,然后对字节码进行解析并处
理,最后输出执行的结果。其实现方式可能有通过解释器直接解释执行,或者是通过即时编译器产生本地代
码,也就是编译执行,当然也可能两者皆有。

1:解释运行
       以解释方式运行字节码解释执行的意思是:读一句执行一句
2:编译运行(JIT)
      将字节码编译成机器码直接执行机器码运行时编译,编译后性能有数量级的提升。

二 栈帧

              栈帧是用于支持JVM进行方法调用和方法执行的数据结构,栈帧随着方法调用而创
建,随着方法结束而销毁。里面存储了方法的局部变量、操作数栈、动态连接、方法返回
地址等信息。如下图示:
 

JVM学习笔记6:字节码执行引擎_第1张图片

栈帧概念结构:
JVM学习笔记6:字节码执行引擎_第2张图片

 

三 局部变量表
 

用来存放方法参数和方法内部定义的局部变量的存储空间。
1:以变量槽slot为单位,目前一个slot存放32位以内的数据类型
2:对于64位的数据占2个slot
3:对于实例方法,第0位slot存放的是this,然后从1到n,依次分配给参数列表
4:然后根据方法体内部定义的变量顺序和作用域来分配slot
5:slot是复用的,以节省栈帧的空间,这种设计可能会影响到系统的垃圾收集行为
 

四 操作数栈
 

用来存放方法运行期间,各个指令操作的数据。方法执行的过程中,会有各种字节
码指令向操作数栈中写入和获取数据,也就是入栈和出栈。
1:操作数栈中元素的数据类型必须和字节码指令的顺序严格匹配
2:在概念模型上,栈帧作为 JVM栈的元素,应该是完全相互独立的。但虚拟机在实现的时候
可能会做一些优化,让两个栈帧出现部分重叠区域,以存放公用的数据,避免额外的参数
复制传递过程。
 

五 动态连接


每个栈帧持有一个指向运行时常量池中该栈帧所属方法的引用,以支持方法调用过
程的动态连接。
1:静态解析:类加载的时候,符号引用就转化成直接引用
2:动态连接:运行期间转换为直接引用


六 方法返回地址

方法执行后,要么正常完成并退出,要么发生异常导致退出。不管哪种方式,都需
要返回到方法被调用的位置,程序才能继续执行,这个位置就是方法返回地址。
 

七 方法调用概述

方法调用就是确定具体调用那一个方法,并不涉及方法内部的执行过程。
1:部分方法是直接在类加载的解析阶段,就确定了直接引用关系,包括:静态方法、私有方
法、实例构造器、父类方法这几种
2:但是对于实例方法,也称虚方法,因为重载和多态,需要运行期动态委派(dispatch)


八  分派

又分成静态分派和动态分派   或者 单分派和多分派
1:静态分派:所有依赖静态类型来定位方法执行版本的分派方式,比如:重载方法
2:动态分派:根据运行期的实际类型来定位方法执行版本的分派方式,比如:覆盖方法
 

单分派多分派就是按照分派思考的纬度,多余一个的就算多分派,只有一个的称为单分派。
 

你可能感兴趣的:(架构,JVM)