1. 程式人生 > >java堆、棧、堆疊的區別

java堆、棧、堆疊的區別

JAVA的JVM的記憶體可分為3個區:堆(heap)、棧(stack)和方法區(method)

堆區:

1.儲存的全部是物件,每個物件都包含一個與之對應的class的資訊。(class的目的是得到操作指令),用new的方式是生成不同的物件。每一次生成一個。只有通過new()方法才能保證每次都建立一個新的物件。
2.jvm只有一個堆區(heap)被所有執行緒共享,堆中不存放基本型別和物件引用,只存放物件本身
3、在堆中分配的記憶體,由Java虛擬機器的自動垃圾回收器來管理。堆的優勢是可以動態地分配記憶體大小,生存期也不必事先告訴編譯器,因為它是在執行時 動態分配記憶體的,Java的垃圾收集器會自動收走這些不再使用的資料。但缺點是,由於要在執行時動態分配記憶體,存取速度較慢。

棧區:

1.每個執行緒包含一個棧區,棧中只儲存基礎資料型別的物件和自定義物件的引用(不是物件),物件都存放在堆區中
2.每個棧中的資料(原始型別和物件引用)都是私有的,其他棧不能訪問。棧有一個很重要的特殊性,就是存在棧中的資料可以共享。
3.棧分為3個部分:基本型別變數區、執行環境上下文、操作指令區(存放操作指令)。
4、棧的優勢是,存取速度比堆要快,僅次於暫存器,棧資料可以共享。但缺點是,存在棧中的資料大小與生存期必須是確定的,缺乏靈活性。棧中主要存放一些基本類 型的變數(,int, short, long, byte, float, double, boolean, char)和物件控制代碼。
5、棧是隻有一個出入口的佇列,即後進先出(First In Last Out),先分配的記憶體必定後釋放。一般由系統自動分配,存放函式的引數值,區域性變數等,自動清除。 堆是全域性的,堆疊是每個函式進入的時候分一小塊,函式返回的時候就釋放了,靜態和全域性變數,new 得到的變數,都放在堆中,區域性變數放在堆疊中,所以函式返回,區域性變數就全沒了。

方法區:

1.又叫靜態區,跟堆一樣,被所有的執行緒共享。方法區包含所有的class和static變數。
2.方法區中包含的都是在整個程式中永遠唯一的元素,如class,static變數。

參考: