《深入理解Java虚拟机》书中原文写到:

每个栈帧都包含一个指向运行时常量池中该栈帧所属方法的引用,持有这个引用是为了支持方法调用过程中的动态链接(Dynamic Linking)。通过第六章的讲解,我们知道Class文件的常量池中存有大量的符号引用,字节码中的方法调用指令就以常量池里指向方法的符号引用作为参数。这些符号引用一部分会在类加载阶段或者第一次使用的时候就被转化为直接引用,这种转化被称为静态解析。另一部分将在每一次运行期间都转化为直接引用,这部分就被称为动态链接。

也就是说,当一个方法被调用的时候,例如invokestatic #2 这样的命令,需要将#2所代表的方法压入栈,通过动态链接找到运行时常量池中具体是哪个对象的该方法。

《深入理解Java虚拟机》中举了一个这样的例子:

Human man = new Man();

我们将上面代码中的“Human”称为变量的“静态类型”(Static Type),或者叫“外观类型”(Apparent Type),后面的“Man”则被称为变量的“实际类型”(Actual Type)或者叫“运行时类型”(Runtime Type)。静态类型和实际类型在程序中都可能会发生变化,区别是静态类型的变化仅仅在使用时发生,变量本身的静态类型不会改变,并且最终的静态类型是在编译期可知的;而实际类型变化的结果在运行期间才可以确定,编译器在编译程序的时候并不知道一个对象的实际类型是什么。譬如有一下的代码:

// 实际类型变化
Human human = (new Random()).nextBoolean() ? new Man : new Woman();
// 静态类型变化
sr.sayHello((Man) human);
sr.sayHello((Woman) human);

通过上述的例子,我们可以知道,虽然方法在编译的时候可以知道一些静态信息,但是具体执行的方法是什么样的需要在具体执行的时候才能够确定。推测压入栈的只是方法的静态信息,具体执行的方法需要通过动态链接握持的指针来具体的确定。

JVM虚拟机栈的栈帧结构中动态链接的理解相关推荐

  1. 关于JVM虚拟机的垃圾收集器7种——摘自《深入理解java虚拟机》(每天学一点Day20191114)

    虚拟机的垃圾收集器(98页) 1.Serial(串行)收集器:最基本.发展历史最悠久的收集器.虚拟机运行在Client模式下的默认新生代收集器.新生代采用复制算法暂停所有用户线程.老年代采用标记-整理 ...

  2. .class文件转换.java_Java中的动态链接VS操作系统动态链接

    在操作系统OS中为了优化内存的使用会采用一种动态链接方式,一个文件想要在操作系统中运行必须经过编译.汇编译.链接.装载等步骤.可以参考Java程序是怎么跑起来的.本篇主要讲解Java栈帧中动态链接部分 ...

  3. 《程序员的自我修养》学习心得——第七章 动态链接※※※

    前言 这一样会有一些在做题当中会用到的点,前面几章一直讲的都是静态链接,静态链接会有一些缺点,比如浪费内存.磁盘空间模块更新困难的问题 一.为什么要动态链接 在说动态链接之前,咱们先回顾一下静态链接, ...

  4. 【Java 虚拟机原理】栈帧 | 动态链接 | 方法区 | 字节码文件二进制分析

    文章目录 前言 一.方法区 二.字节码二进制文件分析 三.动态链接 1.动态链接简介 2.静态链接与动态链接 3.早期绑定 和 晚期绑定 4.动态链接示例 前言 " 栈帧 " 中存 ...

  5. 【Java 虚拟机原理】栈帧 | 局部变量表 | 操作数栈 | 方法出口 | JVM 指令逐条解析

    文章目录 前言 一.JVM 指令逐条解析 1.Java 代码 2.Java 虚拟机指令 3.分析 JVM 指令 4.局部变量表 与 操作数栈 二.方法出口 前言 " 栈帧 " 中存 ...

  6. 11.JDK8内存模型、本地方法栈、虚拟机栈、栈帧结构(局部变量表、操作数栈、方法出口、虚拟机栈与本地方法栈的关系、寄存器、方法区、堆(Heap)、jvm中的常量池、Metaspace(元空间))

    11.JDK8内存模型 11.1.本地方法栈(Native Method Stacks) 11.2.虚拟机栈(Java Virtual Machine Stacks) 11.3.栈帧结构 11.3.1 ...

  7. Java虚拟机运行时栈帧结构--《深入理解Java虚拟机》学习笔记及个人理解(二)

    Java虚拟机运行时栈帧结构(周志明书上P237页) 栈帧是什么? 栈帧是一种数据结构,用于虚拟机进行方法的调用和执行. 栈帧是虚拟机栈的栈元素,也就是入栈和出栈的一个单元. 2018.1.2更新(在 ...

  8. java帧结构_Java虚拟机运行时栈帧结构--《深入理解Java虚拟机》学习笔记及个人理解(二)...

    Java虚拟机运行时栈帧结构(周志明书上P237页) 栈帧是什么? 栈帧是一种数据结构,用于虚拟机进行方法的调用和执行. 栈帧是虚拟机栈的栈元素,也就是入栈和出栈的一个单元. 2018.1.2更新(在 ...

  9. 深入理解JVM虚拟机_4 JVM内部结构分析-栈

    深入理解JVM虚拟机_4 JVM内部结构分析-栈 作者:田超凡 原创博文,仿冒必究,部分素材转载自每特教育蚂蚁课堂 栈 1. Java 虚拟机栈也是线程私有的,它的⽣命周期和线程相同,描述的是 Jav ...

最新文章

  1. Dom4j 学习笔记
  2. 怎样编写测试类测试分支_编写干净的测试–天堂中的麻烦
  3. PCIe总线基本概念
  4. webservice3
  5. linux磁盘管理(挂载,分区)
  6. 检查最后出现子字符串的位置!
  7. 在emacs编辑的文本中插入图片 并直接在文本里显示该图片(转载)
  8. java 线程池_Java 线程池 ThreadPoolExecutor 八种拒绝策略浅析
  9. 高等数学18讲(19版)反常积分的计算与敛散性判别
  10. 加入收藏 设为首页代码收藏本页的代码和收藏本站的代码设为首页代码
  11. 主曲率、高斯曲率、平均曲率的物理意义及公式
  12. 千牛2015卖家版官方电脑版
  13. AI智能语音电销机器人能高效取代繁杂的电话工作
  14. 音频处理—SOX音效
  15. 用java画国际象棋棋盘
  16. 原型图都可以用什么软件做?分享这9款给你
  17. html 上传头像前预览以及点击头像去选择和更换头像
  18. Leetcode刷题06-位运算
  19. 牛投客- 股票与股权投资的区别是什么?
  20. STC89c52定时器的使用以及相关案例

热门文章

  1. python winapi_python---win32gui、win32con、win32api:winAPI操作
  2. android物理按键输入法,Android输入法框架中按键消息的处理流程
  3. 前端:jQuery使用eq的作用
  4. android通过代码设置铃声_有打扰 漏消息?那是Android手机通知设置没弄好!
  5. 全球及中国隔热保温材料市场十四五需求规模与供给前景分析报告2022-2028年
  6. 很多句话让XueTr卸载不了我们的驱动(ObjectType HOOK)
  7. 高收益债券信用风险评估:预期损失率模型
  8. Window对象(1)
  9. 诺顿防病毒软件测试,全面兼容Win8 诺顿安全特警新品评测
  10. echarts水晶球的使用