将变量推送到堆栈和存在于堆栈差异中的变量?
所以我知道存在2个内存区域:堆栈和堆。
我还知道,如果您创建一个局部变量,它将存在于堆栈中,而不是堆中。堆栈将随着我们将数据推送到其中而增长,例如:
现在,我将尝试将我所遇到的困惑传递给您:
例如,这个简单的Java代码:
public class TestClass {
public static void main(String[] args) {
Object foo = null;
Object bar = null;
}
}
被翻译成以下字节码:
public static void main(java.lang.String[]);
Code:
Stack=1, Locals=3, Args_size=1
0: aconst_null
1: astore_1
2: aconst_null
3: astore_2
4: return
LineNumberTable:
line 5: 0
line 6: 2
line 7: 4
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 args [Ljava/lang/String;
2 3 1 foo Ljava/lang/Object;
4 1 2 bar Ljava/lang/Object;
其中,根据定义,acons_null是:
push a null reference onto the stack
astore_1是:
store a reference into local variable 1
我感到困惑的是,我们将foo推入堆栈,然后我们再次将其存储在堆栈中?在局部变量中存储引用是什么意思?局部变量位于何处?我们把foo推入的同一堆栈还是这些单独的堆栈?
现在,如果我在推送到堆栈中的第一个对象上调用一个方法,由于堆栈指针指向我推送的最后一个元素,它将如何处理?