深入理解JVM-虚拟机字节码执行引擎

来源:互联网 发布:深圳湾软件产业基地 编辑:程序博客网 时间:2024/06/06 14:19

8.1 概述

执行引擎是字节码是最核心的组成部分之一。执行引擎在执行java代码的时候,可能会有解释执行(通过解释器执行),和编译执行(通过及时编译器产生本地代码执行)二种选择。但是外观上看起来是一致的:输入的是字节码文件,处理的过程是字节码解析的等效过程,输出的是执行的结果。

8.2 运行时栈帧结构

栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构。栈帧存储了局部变量表,操作数栈,动态链接和方法返回地址等信息和一些额外的附加信息。

8.2.1 局部变量表

用来存放方法参数和方法内的局部变量。编译阶段就已经确定了局部变量表的大小。局部变量表的容量以变量槽为最小单位。long和double类型要占2个槽,需要分割为2次对内存的操作,但是虚拟机可以保证原子性,不允许单独访问其中的一个字节。
虚拟机使用局部变量表完成参数值到参数变量表的传递。第0个slot默认用来传递方法所属对象的引用。其余参数暗战参数表顺序排列,占用从第1个开始的局部变量槽。
变量槽是可以重用的,不过这样的设计,除了会节省空间之外,还可以带来一些负面影响。1、可能会影响垃圾收集器的行为。2、局部变量表不像类变量一样,有二次赋初值的过程,第一次在准备阶段准备初值。局部变量表没有准备阶段,所以不会用默认的零值。必须赋初值才可以使用。

8.2.2操作数栈

操作数栈的最大深度在编译阶段就已经知道了。操作数栈还可以用来在调用其它参数的时候,传递参数。操作数栈中的元素类型必须与指令序列严格匹配,在编译阶段和验证阶段都会检查这一点(现在通过StackMapTable实现)。
虚拟机实现会让二个栈帧出现一部分重叠。让下面操作数栈与上面栈帧的部分变量表重叠在一起。这样就可以服用一部分数据,无需进行外的参数复制传递。
0 0
原创粉丝点击