gpt4 book ai didi

栈帧中的Java运行时常量池引用变量

转载 作者:行者123 更新时间:2023-12-01 17:50:53 25 4
gpt4 key购买 nike

根据以下链接,java堆栈帧包含局部变量、操作数堆栈和当前类常量池引用。 http://blog.jamesdbloom.com/JVMInternals.html

同样来自 Oracle“JVM 的结构”第 2.6.3 节。 “动态链接 - 每个帧(第 2.6 节)都包含对当前方法类型的运行时常量池(第 2.5.5 节)的引用,以支持方法代码的动态链接。”

我还了解到堆中的对象也有一个指向类数据的指针/引用。 https://www.artima.com/insidejvm/ed2/jvm6.html

堆栈帧将包含“当前类常量池引用”,并且还将包含对堆中对象的引用,该对象反过来也将指向类数据。这不是多余吗?

例如。

public class Honda {
public void run() {
System.out.println("honda is running");
}
public static void main(String[] args) {
Honda h = new Honda();
h.run(); //output honda is running
}
}

当 h.run() 即将执行时,jvm 将创建一个新的堆栈帧并将 h 压入该堆栈帧。 h 将指向堆中的对象,该对象又将有一个指向 Honda 类数据的指针。堆栈帧还将具有当前类常量引用。它是否正确?如果没有,请对此进行说明。

最佳答案

Is this not redundant??

也许对于实例方法和构造函数来说这是多余的。

对于静态方法或类初始化伪方法来说,它并不是多余的。

<小时/>

JIT 编译器也可能优化掉(据称的)冗余引用。 (或者也许它没有被优化掉......因为他们得出的结论是冗余会导致平均执行速度更快。)或者也许是 JVM1 的实际实现只是不同而已。

请记住,JVM 规范描述的是理想化的堆栈框架。实际的实现可能会有所不同......只要它的行为符合规范规定的方式即可。

<小时/>

关于@EJP关于规范性的观点,Java唯一的规范性引用是JLS和JVM规范,以及类库的Javadoc。您还可以查阅 JVM 本身的源代码。规范说明了应该发生什么,而代码(在某种意义上)说明了确实发生了什么。您可能在已发表的论文或网络文章中发现的文章不规范,并且很可能不正确或已过时。

<小时/>

1 - 实际实现可能因版本不同或供应商不同而有所不同。此外,我听说过一种 JVM 实现,其中字节码重写器在类加载时从标准字节码转换为另一种抽象机器语言。从性能角度来看,这不是一个好主意……但它肯定符合 JVM 规范的精神。

关于栈帧中的Java运行时常量池引用变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50311664/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com