2012-07-27 54 views
2

一个对象可以包含对其他对象的引用。如果将这些引用声明为类/字段变量,则由于对象本身是在堆上创建的,因此由字段引用表示的值将存储在堆中。本地参考和现场参考内存分配

所以,如果我有

public class A { 
    int size; 
} 
  • 我知道,如果尺寸变的2一个int值,然后将其存储在堆上对象的一部分,但如果是即名称参考大小存储?
  • 名称“size”也存储在堆中对象的内部。
  • JVM如何在堆上交叉引用size == 2
  • 当您加载它在主线程中运行的类时,每个线程都将拥有自己的堆栈。所以这些字段引用不会在主栈上创建正确吗?

回答

1

存储名称“size”在哪里?

该字段的名称存储在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,其中存储了类定义和类字段。还有更多的内存区域,例如垃圾收集器。

+0

波希米亚人,你是说名字大小被存储在类定义文件内的permgen内存,但不是在堆? – Phoenix 2012-07-27 01:13:38

+0

@Phoenix该字段的名称在类定义中,并且类定义在permgen中,所以字段名也在permgen中(嵌套在类定义中) – Bohemian 2012-07-27 01:16:40

+0

Bohemian,如果字段引用是对另一个对象的引用而不是原始的?像A类一样{B名称;}? – Phoenix 2012-07-27 01:30:11