溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

heap和stack有哪些區(qū)別

發(fā)布時(shí)間:2022-11-22 16:58:17 來源:億速云 閱讀:131 作者:iii 欄目:編程語言

這篇“heap和stack有哪些區(qū)別”文章的知識點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“heap和stack有哪些區(qū)別”文章吧。

區(qū)別:1、堆(heap)的空間一般由程序員分配釋放;而棧(stack)的空間由操作系統(tǒng)自動(dòng)分配釋放 。2、heap是存放在二級緩存中,生命周期由虛擬機(jī)的垃圾回收算法來決定;而stack使用的是一級緩存,通常都是被調(diào)用時(shí)處于存儲(chǔ)空間中,調(diào)用完畢立即釋放。3、數(shù)據(jù)結(jié)構(gòu)不同,heap可以被看成是一棵樹,而stack是一種先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu)。

堆(heap)與棧(stack)的概念:

  堆棧是兩種數(shù)據(jù)結(jié)構(gòu)。堆棧都是一種數(shù)據(jù)項(xiàng)按序排列的數(shù)據(jù)結(jié)構(gòu),只能在一端(稱為棧頂(top))對數(shù)據(jù)項(xiàng)進(jìn)行插入和刪除。在單片機(jī)應(yīng)用中,堆棧是個(gè)特殊的存儲(chǔ)區(qū),主要功能是暫時(shí)存放數(shù)據(jù)和地址,通常用來保護(hù)斷點(diǎn)和現(xiàn)場。要點(diǎn):堆,隊(duì)列優(yōu)先,先進(jìn)先出(FIFO—first in first out)。棧,先進(jìn)后出(FILO—First-In/Last-Out)。

堆和棧的區(qū)別:

一、堆??臻g分配區(qū)別:

  1、棧(操作系統(tǒng)):由操作系統(tǒng)自動(dòng)分配釋放 ,存放函數(shù)的參數(shù)值,局部變量的值等。其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧;

  2、堆(操作系統(tǒng)): 一般由程序員分配釋放, 若程序員不釋放,程序結(jié)束時(shí)可能由OS回收,分配方式倒是類似于鏈表。

二、堆棧緩存方式區(qū)別:

  1、棧使用的是一級緩存, 他們通常都是被調(diào)用時(shí)處于存儲(chǔ)空間中,調(diào)用完畢立即釋放;

  2、堆是存放在二級緩存中,生命周期由虛擬機(jī)的垃圾回收算法來決定(并不是一旦成為孤兒對象就能被回收)。所以調(diào)用這些對象的速度要相對來得低一些。

三、堆棧數(shù)據(jù)結(jié)構(gòu)區(qū)別:

  堆(數(shù)據(jù)結(jié)構(gòu)):堆可以被看成是一棵樹,如:堆排序;

  棧(數(shù)據(jù)結(jié)構(gòu)):一種先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu)。

Java中棧和堆:

  棧(stack)與堆(heap)都是Java用來在Ram中存放數(shù)據(jù)的地方。與C++不同,Java自動(dòng)管理?xiàng):投?,程序員不能直接地設(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ū)ο蟮囊米兞俊R米兞烤拖喈?dāng)于是為數(shù)組或?qū)ο笃鸬囊粋€(gè)名稱,以后就可以在程序中使用棧中的引用變量來訪問堆中的數(shù)組或?qū)ο蟆?/p>

Java中變量在內(nèi)存中的分配

  1、類變量(static修飾的變量):在程序加載時(shí)系統(tǒng)就為它在堆中開辟了內(nèi)存,堆中的內(nèi)存地址存放于棧以便于高速訪問。靜態(tài)變量的生命周期–一直持續(xù)到整個(gè)”系統(tǒng)”關(guān)閉。

  2、實(shí)例變量:當(dāng)你使用java關(guān)鍵字new的時(shí)候,系統(tǒng)在堆中開辟并不一定是連續(xù)的空間分配給變量(比如說類實(shí)例),然后根據(jù)零散的堆內(nèi)存地址,通過哈希算法換算為一長串?dāng)?shù)字以表征這個(gè)變量在堆中的”物理位置”。 實(shí)例變量的生命周期–當(dāng)實(shí)例變量的引用丟失后,將被GC(垃圾回收器)列入可回收“名單”中,但并不是馬上就釋放堆中內(nèi)存。

  3、局部變量:局部變量,由聲明在某方法,或某代碼段里(比如for循環(huán)),執(zhí)行到它的時(shí)候在棧中開辟內(nèi)存,當(dāng)局部變量一但脫離作用域,內(nèi)存立即釋放。

以上就是關(guān)于“heap和stack有哪些區(qū)別”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對大家有幫助,若想了解更多相關(guān)的知識內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI