Android技术知识Android开发经验谈Android开发

要点提炼| 理解JVM之字节码执行引擎

2019-01-02  本文已影响24人  厘米姑娘

本篇将从概念模型的角度来介绍虚拟机的方法调用和字节码执行。


1.概述

a.有关虚拟机与物理机的异同

b.有关Java虚拟机字节码执行引擎的概念模型


2.运行时栈帧结构

  • 栈帧(Stack Frame):用于支持虚拟机进行方法调用和方法执行的数据结构,是虚拟机运行时数据区中的虚拟机栈的栈元素
  • 存储内容:方法的局部变量表、操作数栈、动态连接、方法返回地址一些额外的附加信息
  • 每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。
  • 一个栈帧需要分配多少内存在程序编译期就已确定,而不会受到程序运行期变量数据的影响
  • 对于执行引擎来说,只有位于栈顶的栈帧(当前栈帧)才是有效的,即所有字节码指令只对当前栈帧进行操作,与当前栈帧相关联的方法称为当前方法
  • 在概念模型上,典型的栈帧结构如图:

接下来详细介绍栈帧中各个部分的作用和数据结构

a.局部变量表

b.操作数栈

在方法执行的任何时候,操作数栈的深度都不会超过在max_stacks数据项中设定的最大值

c.动态连接(Dynamic Linking):每个栈帧都包含一个指向运行时常量池中该栈帧所属方法的引用,持有这个引用是为了支持方法调用过程中的动态连接

静态解析和动态连接:Class文件的常量池中存有大量的符号引用,字节码中的方法调用指令就以常量池中指向方法的符号引用作为参数,这些符号引用:

  • 一部分会在类加载阶段或者第一次使用的时候就转化为直接引用(静态解析
  • 另一部分会在每一次运行期间转化为直接引用(动态连接

d.方法返回地址

e.附加信息:增加一些规范里没有描述的信息到栈帧之中,如与调试相关的信息

在实际开发中,一般会把动态连接、方法返回地址与其他附加信息全部一起称为栈帧信息


3.方法调用

如何理解Java语言是一门静态多分派、动态单分派的语言?


上一篇下一篇

猜你喜欢

热点阅读