主要區別如下:
一、空間分配:
? ? 1.堆(操作系統):一般由程序員分配釋放,若程序員不釋放,程序結束時可能由OS回收,分配方式類似于鏈表。PS:java中都是系統GC,程序員無法進行GC。
? ? 2.棧(操作系統):由操作系統自動分配釋放,存放函數的參數值,局部變量值等。操作方式與數據結構中的棧相類似。
二、緩存方式:
? ? 1.堆:使用二級緩存,生命周期與虛擬機的GC算法有關(并不是引用為空就立即被GC),調用速度相對較低。
? ? 2.棧:使用一級緩存,被調用時通常處于存儲空間中,調用后被立即釋放。
?三、數據結構:
? ? 1、堆(數據結構):類似于樹結構,可以類比于堆排序
? ? 2、棧(數據結構):先進后出(FILO)
JAVA中的區別:
堆(heap)與棧(stack)都是java在RAM中用來存放數據的地方。與C++不同的是,java自動管理堆(heap)和(棧),程序員不能直接的設置堆和棧。
棧:在函數中定義的一些基本類型的變量和對象的引用變量都在函數的棧內存中分配。當在一段代碼塊中定義一個變量時,java就在棧中為這個變量分配內存空間,當超過變量的作用域后,Java會自動釋放掉為該變量所分配的內存空間,該內存空間可以立即被用作他用。
? ? 堆:對內存用來存放由new創建的對象和數組,在堆中分配的內存,由java虛擬機的自動垃圾回收器來管理。在堆中產生一個數組或對象后,還可以在棧中定義一個特殊的變量,讓棧中的這個變量的取值等于數組或對象在堆內存中的首地址,棧中的這個變量就成了數組或對象的引用變量。
Java中變量在內存中的分配:
1.類變量(static修飾的變量,靜態變量):在程序加載時系統就為他在隊中開辟了內存,堆中的內存地址存放于棧以便于高速訪問。靜態變量的生命周期——一直到系統關閉。
? ? 2.實例變量(實例化對象):當你使用java關鍵字new時,系統在堆中開辟并不一定是連續的空間分配給變量,然后根據零散的堆內存地址,通過哈希算法換算為一長串數字以表征這個變量在堆中的“物理位置”。實例變量的生命周期——實例變量的引用丟失后,將被GC列入到可回收名單中,但不是馬上回收釋放。
? ? 3.局部變量:生命在某個方法或者某段代碼里面,執行到他的時候在棧中開辟內存,局部變量一旦脫離作用域,內存立即釋放。