2013-10-12 294 views
5

JVM在內存中分配這些區域: 類(方法)區域,堆,堆棧,程序計數器寄存器,本地方法堆棧。類區域和堆之間的區別

我知道堆是用來存儲對象和堆棧用來存儲局部變量和部分結果。 根據定義, 類(方法)區存儲每類結構,如運行時常量池,字段和方法數據以及方法的代碼。但我真的不明白其中的差別。

任何人都可以解釋一下Class和Heap之間的區別嗎?

+1

需要一個空間來存儲關於類的所有元數據等。這些不是應用程序中的數據,但它們需要保存完全相同。 – Aaron

回答

9

爪哇6存儲中的所有彼爾姆根

Java 7的常量池和類信息僅存儲在彼爾姆創的類信息字符串文字池是在堆上。

Java 8沒有Perm Gen.文字池和類信息位於堆上。

你已經解釋了區別。像方法這樣的類結構存儲在perm gen中。每個實例中的數據都存儲在堆中。

它們被分開,因爲這些類型的數據具有非常不同的生命週期,例如,對象通常是短命的,而類通常非常長壽。

AFAIK他們正在刪除它,因爲太多的開發人員發現它令人困惑。

+1

對於Java 8,可以肯定地說現在沒有什麼像class class那樣的類定義也存儲在堆上了。 –

+1

@BalkrishanNagpal可以肯定地說,Metaspace就像Perm Hen一樣,但名字不同,調整方式也不同。它做同樣的事情。堆上沒有代碼。 –

3

類(方法)區域存儲代碼 - 這是您的程序的代碼。堆存儲對象實例。例如:

public void MakeSomeFruit(){ 

    Fruit myFruit=new Fruit(); 

} 
  • 的MakeSomeFruit代碼被存儲在類區域。
  • 執行時,它創建的實際Fruit實例存儲在Heap中。
  • 執行時,myFruit 參考變量存儲在堆棧上。這只是一個數字,指向內存中實例的位置 - 一個地址。