2010-05-13 154 views
5

每當加載一個類時,堆中存儲了什麼以及存儲在堆棧中的是什麼?JVM - 堆棧和堆棧

線程還駐留在哪裏?

回答

4

引用類型在堆中。

任何原始類型數據和對堆上的值(方法的參數/局部變量)的引用都在堆棧上。

每個線程都有自己的堆棧。

應用程序中的所有線程共享相同的堆。

+0

@Nirmal:沒什麼奇怪的。無論是C/C++運行時還是其他方式,它在所有運行時都是相同的行爲。所以,我不太明白「爲什麼」這個「爲什麼」從你身邊:) – 2010-05-13 11:18:24

+1

「任何原始類型的數據......都在堆上」有點令人困惑。如果堆是對象的數據成員,堆就會存儲基元。 – 2010-05-13 12:30:56

+0

是的。它的確如..但是,正如你所提到的,作爲複合材料的一部分。然而,當我們訪問數據時,它首先被複制到堆棧上。例如,對於具有定義ComplexNumber {float real,float imaginary}的對象,在doWork(ComplexNumber cn){返回cn.real * cn.real + float.imaginary * float。假想; } 首先將實數/虛數值帶入堆棧unline cn,其中僅將參考引入堆棧 – 2010-05-14 10:26:27

3

這真的很容易:

  • 對象(即類的實例)是總是在堆上。他們不能在其他地方
    • 字段是對象的一部分,所以他們也住在堆上。
  • 局部變量(包括方法/構造函數)參數是總是在棧上。他們不能在其他地方。

注意局部變量只有保持引用(「指針」)或原始數值。局部變量永遠不能容納「一個對象」。

請注意,這個視圖是在JVM規範中定義的。如果需要,具體的JVM可以在非堆區域中分配對象。例如:如果它知道新創建的對象永遠不會轉義當前的調用,那麼它可以將實例化的對象放入堆棧區域。但是,這是開發人員不可見的優化。

0

原語:堆棧

對象:堆

線程:有一個單獨的堆棧而共享相同的堆。

+0

是不是原語存儲在堆上?並在堆棧上,如果他們是本地變量? – Mike 2012-05-22 13:36:16

0

@Joachim紹爾

如果你說的是真的,那麼爲什麼,在下面的代碼,

class Student{ 

    int age;    //instance variable 
    String name;  //instance variable 

     public Student() 
    { 
    this.age = 0; //local variable and member of an object 
    name = "Anonymous"; 
    } 

那麼,爲什麼不是「NAME = 「無名氏」; '一個局部變量? 它是什麼類型的變量,它住在哪裏?