基本类型在JVM中存储的问题
来源:8-4 对象的特殊函数(下)

慕粉6188528
2020-06-30
老师您好,我有一个关于基本类型的问题。
假设:
int a=3;int b = 4;那3是放到栈上的,那a和b怎样关联到3和4的,难道a和b都是3、4的一个指针吗?
若 int a=3;int b = 3; 那 a、b实际上是同一个变量还是说是两个指针指向栈上同一个值
a和b在jvm里面是怎样存储的
2回答
-
我们做个实验,用反编译剖析一下编译生成的byte code。
TestLocalVar.java
package testlocalvar;
public class TestLocalVar {
public void test() {
int a = 3;
int b = 3;
System.out.println(a);
System.out.println(b);
}
}
编译它:
javac TestLocalVar.java
再反编译它
javap -c TestLocalVar.class
得到:
Compiled from "TestLocalVar.java"
public class testlocalvar.TestLocalVar {
public testlocalvar.TestLocalVar();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public void test();
Code:
0: iconst_3 // 把数值3读入栈
1: istore_1 // 把栈顶数据弹出,存入1号变量。编译器在编译时知道1号变量对应"a",但是编译结果中不再需要"a"。1号变量的存储地点在函数调用栈中,也就是我们说的“存放在栈上”。而上述第0行的”栈“只是存放中间结果用的,叫做operand stack,操作数栈
2: iconst_3 // 同上,存储3到2号变量
3: istore_2
4: getstatic #2 // 读取System.out
7: iload_1 // 将变量1的内容读到操作数栈。
8: invokevirtual #3 // 调用System.out.println函数,参数是栈顶元素
11: getstatic #2
14: iload_2
15: invokevirtual #3
18: return
}
我们看到"a","b"已经不存在了。我加了一些注释。
032020-07-02 -
ccmouse
2020-07-01
不论是3和4,还是3和3,都是直接存储在栈上的。若 int a=3;int b = 3;,在栈上就存了两个3。这是因为基本类型的空间都非常小,我们存个指针反而可能比存放3,4来的更废空间。
在编译的时候编译器会维护一个表,里面放着a所对应的存放位置,以及b所对应的存放位置。而编译结束之后的byte code里,不再有"a", "b"的存在。
012020-07-01
相似问题