如何将类型信息存储在内存中(如果有的话)

时间:2014-08-25 17:28:36

标签: java c memory types jvm

我知道C风格的语言如何将数据存储在变量中。它们在堆栈上使用一个或两个块,并且在对象的情况下,还在堆上为其字段分配空间。但是,无论两个块是两个块还是一个int,java都存储在哪里?它是如何知道堆栈中的特定对象引用指向对象的。

产生这个问题的想法是如果我做了

会发生什么
String s;

如果我理解正确,这会在堆栈中创建一个设置为null的对象引用,因此两个字节为零,堆上没有相应的空格。如果是这样,Java"如何记住"该引用属于String?

我可以想象,记住类型并不是必需的,字节码只是对原始数据进行操作,我们知道它是正确的,因为它可以编译。另一方面,这听起来像类型擦除,导致许多角落案件和不安全。如果是这种情况,为什么泛型上的类型擦除与基元和对象本身的类型擦除不同? (即,对于后者,你永远不必考虑它,并且随着泛型它一直在突然出现。)

注意:我说C风格,因为我认为该系列中所有语言的解决方案都是相同的。如果有不同的方法,我也想知道差异。

2 个答案:

答案 0 :(得分:1)

如果String s

  • 方法内的变量,编译字节码时知道该引用是String
  • 类中的变量,静态或非静态,然后类定义包含该字段包含String的知识,尽管它几乎从未使用过 - 它不是真的很有必要。
  • Java中的每个对象都分配了一些引用其自身类型的字节。 (这是存储在引用中 - 它存储在对象本身中。)

答案 1 :(得分:0)

执行此操作时:

String s;

在Java中,它不会占用堆,它只会将其类型的数据保存在 bytecode 中,如果要关联它稍后使用相同类型的堆对象。

一旦明确使用new关键字(或String的情况下隐式使用),就会占用堆,您可以查看它here。)

String s = "foo"; // or 
String s = new String("foo"); // or

MyObject myObject = new MyObject();
                     ^
                     |_ _ _ _ Right here 

检查this