java 棧和堆簡單圖解

編程語言 Java Java虛擬機 技術 小小猿 2017-06-11

java把內存分成兩種,一種叫做棧內存,一種叫做堆內存

在函數中定義的一些基本類型的變量和對象的引用變量都是在函數的棧內存中分配。當在一段代碼塊中定義一個變量時,java就在棧中為這個變量分配內存空間,當超過變量的作用域後,java會自動釋放掉為該變量分配的內存空間,該內存空間可以立刻被另作他用。

堆內存用於存放由new創建的對象和數組。在堆中分配的內存,由java虛擬機自動垃圾回收器來管理。在堆中產生了一個數組或者對象後,還可以在棧中定義一個特殊的變量,這個變量的取值等於數組或者對象在堆內存中的首地址,在棧中的這個特殊的變量就變成了數組或者對象的引用變量,以後就可以在程序中使用棧內存中的引用變量來訪問堆中的數組或者對象,引用變量相當於為數組或者對象起的一個別名,或者代號。

引用變量是普通變量,定義時在棧中分配內存,引用變量在程序運行到作用域外釋放。而數組&對象本身在堆中分配,即使程序運行到使用new產生數組和對象的語句所在地代碼塊之外,數組和對象本身佔用的堆內存也不會被釋放,數組和對象在沒有引用變量指向它的時候,才變成垃圾,不能再被使用,但是仍然佔著內存,在隨後的一個不確定的時間被垃圾回收器釋放掉。這個也是java比較佔內存的主要原因,實際上,棧中的變量指向堆內存中的變量,這就是Java中的指針!

java 棧和堆簡單圖解

實例變量

實例變量是申明在類而不是方法中,他們代表每個獨立對象的“字段”,實例變量存在於所屬的對象中。

java 棧和堆簡單圖解

局部變量

局部變量和方法參數都是聲明在方法中。他們是暫時的,且生命週期僅限於方法放在棧上的這段時間,(即方法調用開始到執行完畢)。

java 棧和堆簡單圖解

理解:你已經知道對象存在於何處——堆,不論對象本身是否聲明和創建,如果局部變量是個對象的引用,只有變量本身放在棧上,對象本身只會存在於堆上。

再看一下方法調用的棧:

java 棧和堆簡單圖解

當最後一個引用消失時,對象就會變成可回收的。

有三種方法可以釋放對象引用。

java 棧和堆簡單圖解

簡單給給大家介紹了一下棧和堆,希望大家喜歡。

相關推薦

推薦中...