【发布时间】:2018-05-13 00:07:39
【问题描述】:
根据以下链接,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 类数据的指针。堆栈帧也将具有当前类常量引用。它是否正确?如果不是,请对此有所了解。
【问题讨论】:
-
静态方法在堆栈上没有
this引用。 -
...您的三个引用中有两个是非规范性的,我的意思是没有地位或地位的任意互联网垃圾。
-
为了证明@EJP 的非规范点,first link 有一个部分“Operand Stack”表示
int i;将生成 2 字节代码指令:iconst_0和 @987654329 @。当然不是这样,因为局部变量没有默认值。语句int i = 0;将生成该字节码,但不会生成文章中的代码。文章有缺陷。 -
事实上,没有初始化器的本地声明根本不会生成任何字节码。 @Andreas。