區(qū)別:1、堆(heap)的空間一般由程序員分配釋放;而棧(stack)的空間由操作系統(tǒng)自動(dòng)分配釋放 。2、heap是存放在二級(jí)緩存中,生命周期由虛擬機(jī)的垃圾回收算法來(lái)決定;而stack使用的是一級(jí)緩存,通常都是被調(diào)用時(shí)處于存儲(chǔ)空間中,調(diào)用完畢立即釋放。3、數(shù)據(jù)結(jié)構(gòu)不同,heap可以被看成是一棵樹(shù),而stack是一種先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu)。
程序員必備接口測(cè)試調(diào)試工具:立即使用
Apipost = Postman + Swagger + Mock + Jmeter
Api設(shè)計(jì)、調(diào)試、文檔、自動(dòng)化測(cè)試工具
后端、前端、測(cè)試,同時(shí)在線(xiàn)協(xié)作,內(nèi)容實(shí)時(shí)同步
本教程操作環(huán)境:windows7系統(tǒng)、java8版、DELL G3電腦。
堆(heap)與棧(stack)的概念:
堆棧是兩種數(shù)據(jù)結(jié)構(gòu)。堆棧都是一種數(shù)據(jù)項(xiàng)按序排列的數(shù)據(jù)結(jié)構(gòu),只能在一端(稱(chēng)為棧頂(top))對(duì)數(shù)據(jù)項(xiàng)進(jìn)行插入和刪除。在單片機(jī)應(yīng)用中,堆棧是個(gè)特殊的存儲(chǔ)區(qū),主要功能是暫時(shí)存放數(shù)據(jù)和地址,通常用來(lái)保護(hù)斷點(diǎn)和現(xiàn)場(chǎng)。要點(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ù)值,局部變量的值等。其操作方式類(lèi)似于數(shù)據(jù)結(jié)構(gòu)中的棧;
2、堆(操作系統(tǒng)): 一般由程序員分配釋放, 若程序員不釋放,程序結(jié)束時(shí)可能由OS回收,分配方式倒是類(lèi)似于鏈表。
二、堆棧緩存方式區(qū)別:
1、棧使用的是一級(jí)緩存, 他們通常都是被調(diào)用時(shí)處于存儲(chǔ)空間中,調(diào)用完畢立即釋放;
2、堆是存放在二級(jí)緩存中,生命周期由虛擬機(jī)的垃圾回收算法來(lái)決定(并不是一旦成為孤兒對(duì)象就能被回收)。所以調(diào)用這些對(duì)象的速度要相對(duì)來(lái)得低一些。
三、堆棧數(shù)據(jù)結(jié)構(gòu)區(qū)別:
堆(數(shù)據(jù)結(jié)構(gòu)):堆可以被看成是一棵樹(shù),如:堆排序;
棧(數(shù)據(jù)結(jié)構(gòu)):一種先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu)。
Java中棧和堆:
棧(stack)與堆(heap)都是Java用來(lái)在Ram中存放數(shù)據(jù)的地方。與C++不同,Java自動(dòng)管理?xiàng):投眩绦騿T不能直接地設(shè)置?;蚨?。
在函數(shù)中定義的一些基本類(lèi)型的變量和對(duì)象的引用變量都在函數(shù)的棧內(nèi)存中分配。當(dāng)在一段代碼塊定義一個(gè)變量時(shí),Java就在棧中為這個(gè)變量分配內(nèi)存空間,當(dāng)超過(guò)變量的作用域后,Java會(huì)自動(dòng)釋放掉為該變量所分配的內(nèi)存空間,該內(nèi)存空間可以立即被另作他用。
堆內(nèi)存用來(lái)存放由new創(chuàng)建的對(duì)象和數(shù)組,在堆中分配的內(nèi)存,由Java虛擬機(jī)的自動(dòng)垃圾回收器來(lái)管理。在堆中產(chǎn)生了一個(gè)數(shù)組或?qū)ο蠛?,還可以在棧中定義一個(gè)特殊的變量,讓棧中這個(gè)變量的取值等于數(shù)組或?qū)ο笤诙褍?nèi)存中的首地址,棧中的這個(gè)變量就成了數(shù)組或?qū)ο蟮囊米兞俊R米兞烤拖喈?dāng)于是為數(shù)組或?qū)ο笃鸬囊粋€(gè)名稱(chēng),以后就可以在程序中使用棧中的引用變量來(lái)訪(fǎng)問(wèn)堆中的數(shù)組或?qū)ο蟆?
Java中變量在內(nèi)存中的分配:
1、類(lèi)變量(static修飾的變量):在程序加載時(shí)系統(tǒng)就為它在堆中開(kāi)辟了內(nèi)存,堆中的內(nèi)存地址存放于棧以便于高速訪(fǎng)問(wèn)。靜態(tài)變量的生命周期–一直持續(xù)到整個(gè)”系統(tǒng)”關(guān)閉。
2、實(shí)例變量:當(dāng)你使用java關(guān)鍵字new的時(shí)候,系統(tǒng)在堆中開(kāi)辟并不一定是連續(xù)的空間分配給變量(比如說(shuō)類(lèi)實(shí)例),然后根據(jù)零散的堆內(nèi)存地址,通過(guò)哈希算法換算為一長(zhǎng)串?dāng)?shù)字以表征這個(gè)變量在堆中的”物理位置”。 實(shí)例變量的生命周期–當(dāng)實(shí)例變量的引用丟失后,將被GC(垃圾回收器)列入可回收“名單”中,但并不是馬上就釋放堆中內(nèi)存。
3、局部變量:局部變量,由聲明在某方法,或某代碼段里(比如for循環(huán)),執(zhí)行到它的時(shí)候在棧中開(kāi)辟內(nèi)存,當(dāng)局部變量一但脫離作用域,內(nèi)存立即釋放。
這里要涉及到Java內(nèi)存問(wèn)題,可以參考:Java的內(nèi)存機(jī)制
推薦教程:《java教程》