棧記憶體:某一個函式被呼叫時,這個函式會在棧記憶體裡面申請一片空間,以後在這個函式內部定義的變數,都會分配到這個函式所申請到的棧。當函式執行結束時,分配給函式的棧空間被收回,在這個函式中被定義的變數也隨之被釋放和消失。
堆記憶體:透過new產生的陣列和物件分配在堆記憶體中。堆記憶體中分配的記憶體,由JVM提供的GC(垃圾回收機制)來管理。在堆記憶體中產生了一個數組物件後,我們還可以在棧中定義一個變數,這個棧中變數的取值等於堆中物件的首地址。棧記憶體中的變數就成了堆記憶體中陣列或者物件的引用變數。我們以後就可以在程式中直接使用棧中的這個變數來訪問我們在堆中分配的陣列或者物件,引用變數相當於陣列或者物件起的一個別名,或者代號。
引用變數是一個普通的變數,定義時在棧中分配;引用變數在被執行到它的作用域之外時就被釋放,而我們的陣列和物件本身是在堆中分配的,即使程式執行到使用new產生物件的語句所在的函式或者程式碼之後,我們剛才被產生的陣列和物件也不會被釋放。陣列和物件只是在沒有引用變數指向它,也就是沒有任何引用變數的值等於它的首地址,它才會變成垃圾不會被使用,但是它任然佔據著記憶體空間不放(這也就是我們Java比較吃記憶體的一個原因),在隨後一個不確定的時間被垃圾回收器收走。
棧記憶體:某一個函式被呼叫時,這個函式會在棧記憶體裡面申請一片空間,以後在這個函式內部定義的變數,都會分配到這個函式所申請到的棧。當函式執行結束時,分配給函式的棧空間被收回,在這個函式中被定義的變數也隨之被釋放和消失。
堆記憶體:透過new產生的陣列和物件分配在堆記憶體中。堆記憶體中分配的記憶體,由JVM提供的GC(垃圾回收機制)來管理。在堆記憶體中產生了一個數組物件後,我們還可以在棧中定義一個變數,這個棧中變數的取值等於堆中物件的首地址。棧記憶體中的變數就成了堆記憶體中陣列或者物件的引用變數。我們以後就可以在程式中直接使用棧中的這個變數來訪問我們在堆中分配的陣列或者物件,引用變數相當於陣列或者物件起的一個別名,或者代號。
引用變數是一個普通的變數,定義時在棧中分配;引用變數在被執行到它的作用域之外時就被釋放,而我們的陣列和物件本身是在堆中分配的,即使程式執行到使用new產生物件的語句所在的函式或者程式碼之後,我們剛才被產生的陣列和物件也不會被釋放。陣列和物件只是在沒有引用變數指向它,也就是沒有任何引用變數的值等於它的首地址,它才會變成垃圾不會被使用,但是它任然佔據著記憶體空間不放(這也就是我們Java比較吃記憶體的一個原因),在隨後一個不確定的時間被垃圾回收器收走。