基本类型在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回答

ccmouse

2020-07-01

我们做个实验,用反编译剖析一下编译生成的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"已经不存在了。我加了一些注释。

0
3
慕粉6188528
回复
ccmouse
谢谢亲!
2020-07-02
共3条回复

ccmouse

2020-07-01

不论是3和4,还是3和3,都是直接存储在栈上的。若 int a=3;int b = 3;,在栈上就存了两个3。这是因为基本类型的空间都非常小,我们存个指针反而可能比存放3,4来的更废空间。 

在编译的时候编译器会维护一个表,里面放着a所对应的存放位置,以及b所对应的存放位置。而编译结束之后的byte code里,不再有"a", "b"的存在。

0
1
慕粉6188528
谢谢您!
2020-07-01
共1条回复

Google面试官亲授-Java面试新手尊享课

为面试新手量身定制的Java面试尊享课,解锁“鲤鱼跃龙门”的妙招

2853 学习 · 180 问题

查看课程