2012-07-27 52 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