2

一个对象可以包含对其他对象的引用。如果将这些引用声明为类/字段变量,那么当对象本身在堆上创建时,字段引用表示的值将存储在堆上。

所以,如果我有

public class A {
    int size;
}
  • 我知道如果 size 得到一个 int 值,2那么它作为对象的一部分存储在堆上,但是引用(即存储的名称大小)在哪里?
  • 是名称“大小”也存储在堆上的对象内部。
  • size == 2JVM如何在堆上交叉引用?
  • 当你加载它在主线程中运行的类时,每个线程都有自己的堆栈。所以这些字段引用不是在主堆栈上创建的吗?
4

1 回答 1

1

名称“大小”存储在哪里?

字段的名称存储在 Class 对象A.class中。您可以使用该java.lang.reflect库检查类字段名称。

例如,要检查一个类的所有字段,请执行以下操作:

for (Field field : A.class.getFields()) {
    String fieldName = field.getName();
    Class<?> fieldClass = field.getType();
    // etc
}

名称“大小”是否也存储在堆上的对象内部?

不,它存储在permgen内存中

堆上的 JVM 交叉引用大小 == 2 如何?

它在编译时查找该字段,其余的发生在字节码中

字段引用不是在主堆栈上创建的吗?

不。除了堆和堆栈之外,还有更多的内存区域,还有 permgen,其中存储了类定义和类字段。还有更多的内存区域,例如垃圾收集器。

于 2012-07-27T01:00:36.197 回答