1. 程式人生 > >java棧、堆、方法區詳解

java棧、堆、方法區詳解

1、java中的棧(stack)和堆(heap)是java在記憶體(ram)中存放資料的地方

2、堆區

     儲存的全部是物件,每個物件都包含一個與之對應的class的資訊。(class的目的是得到操作指令);

     jvm只有一個heap區,被所有執行緒共享,不存放基本型別和物件引用,只存放物件本身。

     堆的優劣勢:堆的優勢是可以動態的分配記憶體大小,生存期也不必事先告訴編譯器,java的垃圾收集器會自動收取這些不在使用的數               

        據,但缺點是,由於要在執行時動態分配記憶體,存取速度慢。

3、棧區

     每一個執行緒包含一個stack區,只儲存基本資料型別的物件和自定義物件的引用(不是物件),物件都存放在共享heap中;

     每個棧中的資料(基本資料型別和物件引用)都是私有的,其他棧不能訪問;

     棧分為3部分:基本型別變數區、執行環境上下文、操作指令區(存放操作指令)

  棧的優勢劣勢:存取速度比堆要快,僅次於直接位於CPU的暫存器,但必須確定的是存在stack中的資料大小與生存期必須是確定          

          的,缺乏靈活性。單個stack的資料可以共享。

      stack:是一個先進後出的資料結構,通常儲存方法中的引數,區域性變數。

      在java中,所有基本型別和引用型別都在stack中儲存,棧中資料的生存空間一般在當前scopes內

4、方法區

     1、又叫靜態區,跟堆一樣,被所有的執行緒共享。方法區包含所有的class和static變數;

     2、方法區中包含的都是在程式中永遠的唯一的元素

5、在JAVA中,有六個不同的地方可以儲存資料:
  1. 暫存器(register)。這是最快的儲存區,因為它位於不同於其他儲存區的地方——處理器內部。但是暫存器的數量極其有限,所    

          以暫存器由編譯器根據需求進行分配。你不能直接控制,也不能在程式中感覺到暫存器存在的任何跡象。


  2. 堆疊(stack)。位於通用RAM中,但通過它的“堆疊指標”可以從處理器哪裡獲得支援。堆疊指標若向下移動,則分配新的記憶體;    

    若向上移動,則釋放那些 記憶體。這是一種快速有效的分配儲存方法,僅次於暫存器。建立程式時候,JAVA編譯器必須知道儲存    

    在堆疊內所有資料的確切大小和生命週期,因為它必須生成 相應的程式碼,以便上下移動堆疊指標。這一約束限制了程式的靈活      

    性,所以雖然某些JAVA資料儲存在堆疊中——特別是物件引用,但是JAVA物件不儲存其 中。


  3. 堆(heap)。一種通用性的記憶體池(也存在於RAM中),用於存放所以的JAVA物件。堆不同於堆疊的好處是:編譯器不需要知    

    道要從堆裡分配多少儲存區 域,也不必知道儲存的資料在堆裡存活多長時間。因此,在堆裡分配儲存有很大的靈活性。當你需要    

    建立一個物件的時候,只需要new寫一行簡單的程式碼,當執行 這行程式碼時,會自動在堆裡進行儲存分配。當然,為這種靈活性必    

    須要付出相應的程式碼。用堆進行儲存分配比用堆疊進行儲存儲存需要更多的時間。


  4. 靜態儲存(static storage)。這裡的“靜態”是指“在固定的位置”。靜態儲存裡存放程式執行時一直存在的資料。你可用關鍵字    

     static來標識一個物件的特定元素是靜態的,但JAVA物件本身從來不會存放在靜態儲存空間裡。


  5. 常量儲存(constant storage)。常量值通常直接存放在程式程式碼內部,這樣做是安全的,因為它們永遠不會被改變。有時,在    

    嵌入式系統中,常量本身會和其他部分分割離開,所以在這種情況下,可以選擇將其放在ROM中


  6. 非RAM儲存。如果資料完全存活於程式之外,那麼它可以不受程式的任何控制,在程式沒有執行時也可以存在。 
   就速度來說,有如下關係: 
   暫存器 < 堆疊 < 堆 < 其他

      執行類過程:方法區找到方法--堆中例項化物件--呼叫棧(指向堆中例項)

1、java中的棧(stack)和堆(heap)是java在記憶體(ram)中存放資料的地方

2、堆區

     儲存的全部是物件,每個物件都包含一個與之對應的class的資訊。(class的目的是得到操作指令);

     jvm只有一個heap區,被所有執行緒共享,不存放基本型別和物件引用,只存放物件本身。

     堆的優劣勢:堆的優勢是可以動態的分配記憶體大小,生存期也不必事先告訴編譯器,java的垃圾收集器會自動收取這些不在使用的數               

        據,但缺點是,由於要在執行時動態分配記憶體,存取速度慢。

3、棧區

     每一個執行緒包含一個stack區,只儲存基本資料型別的物件和自定義物件的引用(不是物件),物件都存放在共享heap中;

     每個棧中的資料(基本資料型別和物件引用)都是私有的,其他棧不能訪問;

     棧分為3部分:基本型別變數區、執行環境上下文、操作指令區(存放操作指令)

  棧的優勢劣勢:存取速度比堆要快,僅次於直接位於CPU的暫存器,但必須確定的是存在stack中的資料大小與生存期必須是確定          

          的,缺乏靈活性。單個stack的資料可以共享。

      stack:是一個先進後出的資料結構,通常儲存方法中的引數,區域性變數。

      在java中,所有基本型別和引用型別都在stack中儲存,棧中資料的生存空間一般在當前scopes內

4、方法區

     1、又叫靜態區,跟堆一樣,被所有的執行緒共享。方法區包含所有的class和static變數;

     2、方法區中包含的都是在程式中永遠的唯一的元素

5、在JAVA中,有六個不同的地方可以儲存資料:
  1. 暫存器(register)。這是最快的儲存區,因為它位於不同於其他儲存區的地方——處理器內部。但是暫存器的數量極其有限,所    

          以暫存器由編譯器根據需求進行分配。你不能直接控制,也不能在程式中感覺到暫存器存在的任何跡象。


  2. 堆疊(stack)。位於通用RAM中,但通過它的“堆疊指標”可以從處理器哪裡獲得支援。堆疊指標若向下移動,則分配新的記憶體;    

    若向上移動,則釋放那些 記憶體。這是一種快速有效的分配儲存方法,僅次於暫存器。建立程式時候,JAVA編譯器必須知道儲存    

    在堆疊內所有資料的確切大小和生命週期,因為它必須生成 相應的程式碼,以便上下移動堆疊指標。這一約束限制了程式的靈活      

    性,所以雖然某些JAVA資料儲存在堆疊中——特別是物件引用,但是JAVA物件不儲存其 中。


  3. 堆(heap)。一種通用性的記憶體池(也存在於RAM中),用於存放所以的JAVA物件。堆不同於堆疊的好處是:編譯器不需要知    

    道要從堆裡分配多少儲存區 域,也不必知道儲存的資料在堆裡存活多長時間。因此,在堆裡分配儲存有很大的靈活性。當你需要    

    建立一個物件的時候,只需要new寫一行簡單的程式碼,當執行 這行程式碼時,會自動在堆裡進行儲存分配。當然,為這種靈活性必    

    須要付出相應的程式碼。用堆進行儲存分配比用堆疊進行儲存儲存需要更多的時間。


  4. 靜態儲存(static storage)。這裡的“靜態”是指“在固定的位置”。靜態儲存裡存放程式執行時一直存在的資料。你可用關鍵字    

     static來標識一個物件的特定元素是靜態的,但JAVA物件本身從來不會存放在靜態儲存空間裡。


  5. 常量儲存(constant storage)。常量值通常直接存放在程式程式碼內部,這樣做是安全的,因為它們永遠不會被改變。有時,在    

    嵌入式系統中,常量本身會和其他部分分割離開,所以在這種情況下,可以選擇將其放在ROM中


  6. 非RAM儲存。如果資料完全存活於程式之外,那麼它可以不受程式的任何控制,在程式沒有執行時也可以存在。 
   就速度來說,有如下關係: 
   暫存器 < 堆疊 < 堆 < 其他

      執行類過程:方法區找到方法--堆中例項化物件--呼叫棧(指向堆中例項)