主要區(qū)別如下:
一、空間分配:
? ? 1.堆(操作系統(tǒng)):一般由程序員分配釋放民轴,若程序員不釋放攻柠,程序結(jié)束時(shí)可能由OS回收,分配方式類似于鏈表后裸。PS:java中都是系統(tǒng)GC,程序員無法進(jìn)行GC冒滩。
? ? 2.棧(操作系統(tǒng)):由操作系統(tǒng)自動(dòng)分配釋放微驶,存放函數(shù)的參數(shù)值,局部變量值等开睡。操作方式與數(shù)據(jù)結(jié)構(gòu)中的棧相類似因苹。
二、緩存方式:
? ? 1.堆:使用二級緩存篇恒,生命周期與虛擬機(jī)的GC算法有關(guān)(并不是引用為空就立即被GC)扶檐,調(diào)用速度相對較低。
? ? 2.棧:使用一級緩存胁艰,被調(diào)用時(shí)通常處于存儲(chǔ)空間中款筑,調(diào)用后被立即釋放。
?三腾么、數(shù)據(jù)結(jié)構(gòu):
? ? 1奈梳、堆(數(shù)據(jù)結(jié)構(gòu)):類似于樹結(jié)構(gòu),可以類比于堆排序
? ? 2解虱、棧(數(shù)據(jù)結(jié)構(gòu)):先進(jìn)后出(FILO)
JAVA中的區(qū)別:
堆(heap)與棧(stack)都是java在RAM中用來存放數(shù)據(jù)的地方攘须。與C++不同的是,java自動(dòng)管理堆(heap)和(棧)殴泰,程序員不能直接的設(shè)置堆和棧于宙。
棧:在函數(shù)中定義的一些基本類型的變量和對象的引用變量都在函數(shù)的棧內(nèi)存中分配浮驳。當(dāng)在一段代碼塊中定義一個(gè)變量時(shí),java就在棧中為這個(gè)變量分配內(nèi)存空間捞魁,當(dāng)超過變量的作用域后抹恳,Java會(huì)自動(dòng)釋放掉為該變量所分配的內(nèi)存空間,該內(nèi)存空間可以立即被用作他用署驻。
? ? 堆:對內(nèi)存用來存放由new創(chuàng)建的對象和數(shù)組奋献,在堆中分配的內(nèi)存,由java虛擬機(jī)的自動(dòng)垃圾回收器來管理旺上。在堆中產(chǎn)生一個(gè)數(shù)組或?qū)ο蠛笃柯欤€可以在棧中定義一個(gè)特殊的變量,讓棧中的這個(gè)變量的取值等于數(shù)組或?qū)ο笤诙褍?nèi)存中的首地址宣吱,棧中的這個(gè)變量就成了數(shù)組或?qū)ο蟮囊米兞俊?/p>
Java中變量在內(nèi)存中的分配:
1.類變量(static修飾的變量窃这,靜態(tài)變量):在程序加載時(shí)系統(tǒng)就為他在隊(duì)中開辟了內(nèi)存,堆中的內(nèi)存地址存放于棧以便于高速訪問征候。靜態(tài)變量的生命周期——一直到系統(tǒng)關(guān)閉杭攻。
? ? 2.實(shí)例變量(實(shí)例化對象):當(dāng)你使用java關(guān)鍵字new時(shí),系統(tǒng)在堆中開辟并不一定是連續(xù)的空間分配給變量疤坝,然后根據(jù)零散的堆內(nèi)存地址兆解,通過哈希算法換算為一長串?dāng)?shù)字以表征這個(gè)變量在堆中的“物理位置”。實(shí)例變量的生命周期——實(shí)例變量的引用丟失后跑揉,將被GC列入到可回收名單中锅睛,但不是馬上回收釋放。
? ? 3.局部變量:生命在某個(gè)方法或者某段代碼里面历谍,執(zhí)行到他的時(shí)候在棧中開辟內(nèi)存现拒,局部變量一旦脫離作用域,內(nèi)存立即釋放望侈。