当前位置: 首页 > 知识库问答 >
问题:

Java实例方法的堆栈框架中的超级引用在哪里?

梁建德
2023-03-14

我读了比尔·文纳的《Java虚拟机内部》一书,这本书在第5章中详细探讨了JVM堆栈框架的组成。(这本书的这一章也恰好在这里正式出版:https://www.artima.com/insidejvm/ed2/jvm8.html)除了这本书,我还相对地研究了一些JVM的运行时数据区域,尤其是它们的堆栈和堆。

在实例方法的堆栈框架中,局部变量部分构成一个单词数组,其中包含方法参数(或参数)、局部变量和该引用的“隐藏”字段。

我想知道的是,超级引用存储在哪里,因为它也总是在任何非静态上下文(即实例方法主体或初始化器块)中可用,除了在Object类中。它存储在引用“这个”旁边的某个地方吗?如果是,那么为什么它似乎总是被排除在堆栈框架表示/概述之外?

共有2个答案

居飞扬
2023-03-14

“隐藏此”引用不以您认为的方式存在。

如果您调用super。toString(),然后将super解析并存储为“隐藏此”。因此,一旦创建了runInstanceMethod()——在我们的示例中是toString()——的堆栈框架,“hidden this”就是前一个super。

换句话说,“hidden this”总是指当前成员方法所属的对象。

楚权
2023-03-14

没有“超级”参考。

当您这样做时:

super.foo()

您“似乎”在调用一个名为“super”的对象上的foo,但这只是Java的语法,不必反映引擎盖下发生的事情。当这个调用被转换时,它被转换为调用超类的foo方法的invokespecial指令。

将其与this.foo()调用进行比较,后者转换为invokeviral指令。与invokesSpecial不同,这将执行动态调度,根据this的运行时类型,选择要调用的正确方法。

请注意,在这两种情况下,在调用方法之前都有一条aload_0指令,将this引用加载到堆栈中。

 类似资料:
  • 根据以下链接,java堆栈框架包含本地变量、操作数堆栈和当前类常量池引用。http://blog.jamesdbloom.com/JVMInternals.html 同样来自Oracle“JVM结构”第2.6节。3.“动态链接-每个帧(§2.6)包含对当前方法类型的运行时常量池(§2.5.5)的引用,以支持方法代码的动态链接。” 我还读到堆中的对象也有一个指向类数据的指针/引用。https://w

  • 问题内容: 我有个问题 例如,当我在方法内部声明变量时会发生什么。 在堆栈或堆中的哪里分配了myShip参考? 我认为是在堆栈中,但由于我在阅读《 J2ME游戏编程》“ Java类已实例化到Java堆”上而感到困惑 所有Java类别? 提前致谢 问题答案: 是对对象的引用,位于方法调用堆栈上,称为“堆栈”。当一个方法被称为一个内存块被推到栈顶时,该内存块有空间容纳所有原语(int,float,bo

  • 虽然我对Java不是很陌生,但以下问题让我非常困惑,以至于我无法克服。我在网上搜索了很多,也找到了一些答案,但并不完全令人满意。谁能帮我消除疑虑吗 我的困惑是: 问题1:迭代器是一个接口,我们不能实例化或创建接口的对象。那么,我们应该在这里称之为“iter”,它是什么? 问题1.1:迭代器的所有方法(例如next())都由“iter”调用。这些方法在哪里定义?如果这些方法是在向量类的特定内部类中定

  • 本文向大家介绍Java利用反射实现框架类的方法实例,包括了Java利用反射实现框架类的方法实例的使用技巧和注意事项,需要的朋友参考一下 框架类的简单实现 实现步骤: 1. 加载配置文件 2. 获取配置文件中定义的数据 3. 加载该类进内存 主要讲解第一步:加载配置文件 的相关知识。 Properties 是map接口的实现类,它有一个特有的功能:可以保存到流中或者从流中加载。本例中用到它的方法有:

  • 问题内容: 当我在Intellij Idea中调试Java应用程序时,我在堆栈框架中看到所有变量,如下所示: “ @”后面的数字是什么意思?它不同于hashCode返回的内容。hashCode以十六进制表示形式返回数字2a134eca,等于整数表示形式705908426。数字77和705908426是不同的。 问题答案: @是自应用程序启动以来的对象计数编号。因此,@ 1012表示自应用启动以来创

  • 问题内容: 我知道常量池的概念以及JVM用于处理字符串文字的字符串常量池。但是我不知道JVM使用哪种类型的内存来存储String常量文字。堆栈还是堆?由于它的文字不与任何实例相关联,因此我假定它将存储在堆栈中。但是,如果没有任何实例引用该文字,则必须通过GC运行来收集文字(如果我错了,请纠正我),那么如果将其存储在堆栈中,该如何处理? 问题答案: 从技术上来说,答案都不是。根据Java虚拟机规范,