1. 程式人生 > >初學者對堆和棧的認識

初學者對堆和棧的認識

        計算機存取資料主要是暫存器、棧空間以及堆空間。對於棧空間來說,主要有兩大優點:存取效率高,僅次於暫存器,佔用空間小,資料可以共享。缺點是存取在棧中的資料大小以及生存週期必須是確定的。基本型別的資料定義都存放在棧中,變數退出其作用域的時候,棧空間將釋放該變數的記憶體空間。對於堆空間而言,資料存放的位置是隨機分配的,存放資料效率較低,空間大。由new建立的物件和陣列都在堆空間中分配記憶體,由java虛擬機器的垃圾回收器管理。

        棧空間和堆空間的關係:在堆空間new出一個數組或者物件後,還可以 在棧中定義一個特殊的變數,讓棧中這個變數的取值等於陣列或物件在堆記憶體中的首地址,棧中的這個變數就成了陣列或物件的引用變數。

引用變數是普通的變數,定義時在棧中分配,引用變數在程式執行到其作用域之外後被釋放。而陣列和物件本身在堆中分配,即使程式 執行到使用 new 產生陣列或者物件的語句所在的程式碼塊之外,陣列和物件本身佔據的記憶體不會被釋放,陣列和物件在沒有引用變數指向它的時候,才變為垃圾,不能在被使用,但仍 然佔據記憶體空間不放,在隨後的一個不確定的時間被垃圾回收器收走(釋放掉)。