2009-11-11 100 views
1

嗨,我回顧了一些問題,但我真的不能看着辦吧,我看着通過文字的書,但我不知道在哪裏可以找到答案......java和內存佈局

我知道這將是很難做記憶圖W/O圖片,但請與我一起。

interface Lovable 
    public void love(); 

class Foo implements Lovable 
    public void love(); 
     // something 
    public int val() 
     // return something1 

public class Love 
    public static void main(String args []) 
     Foo foo = new Foo() 
     foo.love() 
     foo.love() 
     int bar = =foo.val() 
     System.out.print(v) 

現在,我看到富都被定義爲new,所以我知道實際的Foo類信息存儲在堆,並有一個框架?指針?指向堆棧頂部的堆內存空間(在foo調用任何方法之前)。那麼界面怎麼樣?那會被存儲在堆中嗎?

所以堆棧的底部將是Love類(也包含int bar),一個指向堆中Foo foo的指針,foo.love()的另一個框架,另一個foo.love()框架, foo.val()的框架,用於打印的框架?

我明白了嗎?還是我真的很遠?如果您知道我可以從哪裏獲得更多信息,請告訴我。我很欣賞任何輸入。

回答

4

通常,對象是否存儲在由垃圾回收器管理的heap上。

只有latest release of Java 6具有逃逸分析才能存儲堆棧中的對象(如果它們沒有逃脫)。

類信息存儲在perm space

0

foo該引用位於堆棧上。由foo指向的對象位於堆上(它可能實際上在簡單情況下優化到堆棧上,但概念上它在堆上)。

對象的類可能有超類和實現接口。但是,無論在哪個類中聲明一個字段,實例字段都保存在堆中相同的內存分配中。

+0

一張非常漂亮的照片! – 2009-11-11 12:10:28

+0

這很奇怪... – Skilldrick 2009-11-11 12:28:52

+0

哦,是的,它有3個武器。 – 2009-11-11 12:31:44

1

內存佈局依賴於JVM,JVM只要保持程序員所認爲的Java對象模型的邏輯視圖,就有很多關於如何使用內存的餘地。 Sun JVM有幾個「堆」,因爲它實現了分代垃圾收集。對象在eden空間中創建,它被視爲一個堆棧,以便可以快速創建對象。如果它們活得足夠長,物體會移動到更長時間的世代,而那些實現更像正常動態分配的堆。 JVM將類和interned字符串存儲在「permspace」堆中。 Permspace實際上並不是永久的:當沒有對它們的實例或類加載器的更多引用時收集類。而且,正如上面指出的那樣,如果Java 6能夠確定對該對象的引用不會離開該塊,則Java 6將在該調用堆棧上分配一個對象。