【问题标题】:How is type information stored in memory (if at all)类型信息如何存储在内存中(如果有的话)
【发布时间】:2014-10-18 22:01:36
【问题描述】:

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

产生这个问题的想法是如果我这样做会发生什么

String s;

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

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

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

【问题讨论】:

  • C 风格并不意味着 C 风格的内存管理。你不能将 C 风格的语法等同于 C 风格的内存管理。
  • @VaibhavRaj,很公平,但我认为他们中的大多数人都以同样的方式解决了这个问题......
  • 致选民:请在投反对票时发表评论。我想知道是什么让这个问题不合适。

标签: java c memory types jvm


【解决方案1】:

当你这样做时:

String s;

在Java中,它不占用堆,它只将其类型的数据保存在bytecode中,如果要关联到它的堆对象以后也一样。

一旦显式使用new关键字(或隐式使用String,你可以查看here),堆被占用。

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

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

签出this

【讨论】:

  • 这不是一个真正的答案。正如我在我的问题中指出的那样,我知道它只在堆栈上创建一个引用,而在堆中没有任何内容(除非 s 是一个字段,在这种情况下,引用 确实 存在于堆栈中)。我的问题是关于类型信息的存储位置。
  • 好吧,实际上它会将其类型的数据保存在字节码中,如果稍后将其与相同类型的堆对象相关联。
【解决方案2】:

如果String s

  • 方法内的变量,编译字节码时知道该引用是String
  • 类中的变量,无论是静态的还是非静态的,那么类定义包括该字段包含 String 的知识,尽管这几乎从未使用过——这并不是真正必要的。
  • Java 中的每个对象都分配了几个字节来引用它自己的类型。 (这存储在引用中——它存储在对象本身中。)

【讨论】:

  • 因此,如果我正确阅读了您的答案,它将存储在周围的类中(如果有的话)和对象中(如果引用为非空)。如果 s 在方法内部,并且引用为空,我是否正确地说引用是字符串的信息被删除了?只能从字节码对待那位数据的方式来推断?
  • 不完全;字节码确实保留了方法堆栈帧中每个局部变量的类型。
猜你喜欢
  • 2013-10-30
  • 1970-01-01
  • 2014-03-08
  • 1970-01-01
  • 1970-01-01
  • 2022-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多