java面試 內(nèi)存中堆和棧的區(qū)別

java中的內(nèi)存腐缤,分為兩種慢蜓,一為堆內(nèi)存,二為棧內(nèi)存。

棧內(nèi)存

在函數(shù)中定義的基本類型的變量和對象的引用變量都是在函數(shù)的棧內(nèi)存中分配闪檬。
當(dāng)在一段代碼塊中聲明了一個變量時星著,java就會在棧內(nèi)存中為這個變量分配內(nèi)存空間,當(dāng)超過變量的作用域之后粗悯,java也會自動釋放為該變量分配的空間虚循,而這個回收的空間可以即刻用作他用。

堆內(nèi)存

堆內(nèi)存用于存放由new創(chuàng)建的對象和數(shù)組样傍。
在堆內(nèi)存中分配的內(nèi)存空間横缔,由java虛擬機(jī)自動垃圾回收器來管理。在堆中產(chǎn)生了一個數(shù)組或者對象后衫哥,還可以在棧中定義一個特殊的變量剪廉,變量的值就等于數(shù)組或?qū)ο笤诙褍?nèi)存中的首地址,而這個棧中的特殊變量炕檩,也就成為數(shù)組或?qū)ο蟮囊米兞慷方R院罂梢栽诔绦蛑惺褂脳?nèi)存中的引用變量訪問堆內(nèi)存中的數(shù)組或?qū)ο罅恕R米兞肯喈?dāng)于是為數(shù)組或?qū)ο笃鸬囊粋€別名笛质,或者是代號泉沾。
數(shù)組和對象在沒有引用變量指向它的時候,才變成垃圾妇押,不能被繼續(xù)使用跷究,但是仍然會占用堆內(nèi)存空間,而后在一個不確定的時間內(nèi)敲霍,由java虛擬機(jī)自動垃圾回收器回收俊马,這也是java程序?yàn)槭裁磿加煤艽髢?nèi)存的原因。


一肩杈、 java中的內(nèi)存分配策略及堆和棧的比較

1. 內(nèi)存分配策略

根據(jù)編譯原理的觀點(diǎn)柴我,程序運(yùn)行時的內(nèi)存分配,有三種策略扩然,分別為靜態(tài)的艘儒、堆式的棧式的夫偶。
靜態(tài)存儲分配指的是在編譯時就能確定每個數(shù)據(jù)目標(biāo)在運(yùn)行時的存儲空間需求界睁,因而在編譯時就給它們分配了固定的內(nèi)存空間。這種分配方式要求程序代碼中不能有可變數(shù)據(jù)結(jié)構(gòu)(例如可變數(shù)組)的存在兵拢,也不允許有嵌套或者遞歸的結(jié)構(gòu)出現(xiàn)翻斟,因?yàn)樗鼈兌紩?dǎo)致編譯時編譯程序無法準(zhǔn)確計算所需的存儲空間大小。
棧式存儲分配也可以成為動態(tài)存儲分配说铃,是由一個類似于堆棧的運(yùn)行棧來實(shí)現(xiàn)的访惜。和靜態(tài)存儲分配相反嘹履,在棧式分配方案中,程序?qū)τ诖鎯臻g的需要在編譯時是未知的疾牲,只有在運(yùn)行的時候才能知道植捎。但是規(guī)定在運(yùn)行進(jìn)入一個程序模塊時,必須要知道該程序模塊所需的數(shù)據(jù)區(qū)大小才能為其分配內(nèi)存阳柔。同我們?nèi)粘A私獾臈R恢卵媸啵瑮J酱鎯Ψ峙渥裾障冗M(jìn)后出的原則進(jìn)行分配。
堆式存儲分配專門負(fù)責(zé)在編譯時或運(yùn)行時程序模塊入口處都無法確定存儲要求的數(shù)據(jù)結(jié)構(gòu)的分配舌剂,比如可變長度串和對象實(shí)例济锄。堆內(nèi)存由大片的可利用塊或空閑塊組成,堆中的內(nèi)存也可以根據(jù)任意的順序進(jìn)行分配和釋放霍转。

堆和棧的比較

從通俗化的角度來說荐绝,堆是用來存放對象的,棧是用來存放執(zhí)行程序的
在編程中避消,例如在C/C++中低滩,所有的方法調(diào)用都是通過棧來進(jìn)行的,所有的局部變量岩喷、形式參數(shù)也都是通過棧來分配內(nèi)存的恕沫。使用的時候,根據(jù)棧的工作原理纱意,從棧頂向上用即可婶溯,Stack Pointer會自動指引程序到存儲位置,程序只需要進(jìn)行存儲即可偷霉。退出函數(shù)的時候迄委,修改棧指針即可將棧中存儲的內(nèi)容銷毀。這種模塊速度最快类少,適合用戶存儲執(zhí)行程序叙身。但是應(yīng)當(dāng)注意的是,在進(jìn)行內(nèi)存分配是瞒滴,比如為一個即將要調(diào)用的程序模塊分配數(shù)據(jù)區(qū)時曲梗,應(yīng)當(dāng)實(shí)現(xiàn)知道這個所需數(shù)據(jù)區(qū)的大小,也就是說雖然分配工作是在運(yùn)行程序的時候進(jìn)行的妓忍,但是分配的大小是在運(yùn)行程序之前就知道的,這個是編譯時確定的愧旦,而不是運(yùn)行時世剖。
堆是應(yīng)用程序在運(yùn)行過程中請求操作系統(tǒng)給分配的內(nèi)存,由于是操作系統(tǒng)管理的內(nèi)存分配笤虫,所以在分配和銷毀是都需要占用時間旁瘫,因此堆的工作效率比較低祖凫。但是堆的優(yōu)點(diǎn)在于,編譯器不需要知道從堆中分配了多少的內(nèi)存空間酬凳,也不需要知道存儲的數(shù)據(jù)要在堆中停留多長的時間惠况,這也就使得用堆來保存數(shù)據(jù)有著更大的靈活性。事實(shí)上宁仔,面向?qū)ο蟮亩鄳B(tài)性的實(shí)現(xiàn)稠屠,堆內(nèi)存的分配必不可少,因?yàn)槎鄳B(tài)對象所需的數(shù)據(jù)區(qū)大小只有在運(yùn)行時確定了對象以后才能知道翎苫。在java中权埠,創(chuàng)建對象只需要使用new關(guān)鍵字即可,執(zhí)行這些代碼時煎谍,就會在堆中自動進(jìn)行數(shù)據(jù)的保存攘蔽。也就是因?yàn)檫@種靈活分配存儲空間的特性,堆內(nèi)存分配的工作效率不高呐粘。

JVM中的堆和棧

堆和棧都是java用來在內(nèi)存中存放數(shù)據(jù)的地方满俗,與C++不同的是,java自動管理堆和棧作岖,程序員不能自行設(shè)置堆和棧唆垃。
java中的堆就是運(yùn)行時存儲數(shù)據(jù)的區(qū)域,類的實(shí)例對象可以通過new鳍咱、new Array等指令建立從中分配空間降盹,這些空間不需要程序代碼來顯式釋放。堆是由jvm自動垃圾回收器負(fù)責(zé)的谤辜,堆的優(yōu)勢是可以動態(tài)的分配內(nèi)存大小蓄坏,生存周期也不用實(shí)現(xiàn)告訴編譯器,因?yàn)榭臻g是在運(yùn)行時動態(tài)進(jìn)行內(nèi)存分配的丑念。如果堆中的數(shù)據(jù)確認(rèn)為垃圾涡戳,則jvm的自動垃圾回收器匯自動回收相應(yīng)的空間。但是缺點(diǎn)是脯倚,由于實(shí)在運(yùn)行時動態(tài)進(jìn)行空間分配渔彰,存取速度較慢。
棧的優(yōu)勢是:存取的速度都比堆要快推正,僅次于寄存器恍涂。棧數(shù)據(jù)可以共享,但是缺點(diǎn)時植榕,椩俨祝空間中的數(shù)據(jù)大小和生存期必須是確定的,缺乏靈活性尊残。棧主要存放一些基本類型的變量int, short, long, byte, float, double, boolean, char和對象句柄炒瘸。
棧有一個很重要的特殊性淤堵,就是存在棧中的數(shù)據(jù)可以共享。假設(shè)我們同時定義:

int a = 3; 
int b = 3; 

編譯器先處理int a = 3;首先它會在棧中創(chuàng)建一個變量為a的引用顷扩,然后查找棧中是否有3這個值拐邪,如果沒找到,就將3存放進(jìn)來隘截,然后將a指向3扎阶。接著處理int b = 3;在創(chuàng)建完b的引用變量后,因?yàn)樵跅V幸呀?jīng)有3這個值技俐,便將b直接指向3乘陪。這樣,就出現(xiàn)了a與b同時均指向3的情況雕擂。這時啡邑,如果再令a=4;那么編譯器會重新搜索棧中是否有4值,如果沒有井赌,則將4存放進(jìn)來谤逼,并令a指向4;如果已經(jīng)有了,則直接將a指向這個地址仇穗。因此a值的改變不會影響到b的值流部。要注意這種數(shù)據(jù)的共享與兩個對象的引用同時指向一個對象的這種共享是不同的,因?yàn)檫@種情況a的修改并不會影響到b, 它是由編譯器完成的纹坐,它有利于節(jié)省空間枝冀。而一個對象引用變量修改了這個對象的內(nèi)部狀態(tài),會影響到另一個對象引用變量耘子。

參考:http://www.cnblogs.com/whgw/archive/2011/09/29/2194997.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末果漾,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子谷誓,更是在濱河造成了極大的恐慌绒障,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捍歪,死亡現(xiàn)場離奇詭異户辱,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)糙臼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進(jìn)店門庐镐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人变逃,你說我怎么就攤上這事焚鹊。” “怎么了韧献?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵末患,是天一觀的道長。 經(jīng)常有香客問我锤窑,道長璧针,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任渊啰,我火速辦了婚禮探橱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘绘证。我一直安慰自己隧膏,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布嚷那。 她就那樣靜靜地躺著胞枕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪魏宽。 梳的紋絲不亂的頭發(fā)上腐泻,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天,我揣著相機(jī)與錄音队询,去河邊找鬼派桩。 笑死,一個胖子當(dāng)著我的面吹牛蚌斩,可吹牛的內(nèi)容都是我干的铆惑。 我是一名探鬼主播,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼送膳,長吁一口氣:“原來是場噩夢啊……” “哼员魏!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起肠缨,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤逆趋,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后晒奕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體闻书,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年脑慧,在試婚紗的時候發(fā)現(xiàn)自己被綠了魄眉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡闷袒,死狀恐怖坑律,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情囊骤,我是刑警寧澤晃择,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布冀值,位于F島的核電站,受9級特大地震影響宫屠,放射性物質(zhì)發(fā)生泄漏列疗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一浪蹂、第九天 我趴在偏房一處隱蔽的房頂上張望抵栈。 院中可真熱鬧,春花似錦坤次、人聲如沸古劲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽产艾。三九已至,卻和暖如春洛波,著一層夾襖步出監(jiān)牢的瞬間胰舆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工蹬挤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缚窿,地道東北人。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓焰扳,卻偏偏與公主長得像倦零,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子吨悍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 從三月份找實(shí)習(xí)到現(xiàn)在扫茅,面了一些公司,掛了不少育瓜,但最終還是拿到小米葫隙、百度、阿里躏仇、京東恋脚、新浪、CVTE焰手、樂視家的研發(fā)崗...
    時芥藍(lán)閱讀 42,213評論 11 349
  • Java把內(nèi)存分成兩種糟描,一種叫做棧內(nèi)存,一種叫做堆內(nèi)存 在函數(shù)中定義的一些基本類型的變量和對象的引用變量都是在函數(shù)...
    keyu88888閱讀 1,286評論 3 47
  • Java把內(nèi)存分成兩種书妻,一種叫做棧內(nèi)存船响,一種叫做堆內(nèi)存 在函數(shù)中定義的一些基本類型的變量和對象的引用變量都是在函數(shù)...
    殺小賊閱讀 357評論 0 1
  • 在函數(shù)中定義的一些基本類型的變量和對象的引用變量都在函數(shù)的棧內(nèi)存中分配。 當(dāng)在一段代碼塊定義一個變量時,Java就...
    木有魚丸啦閱讀 545評論 0 0
  • 又到了考博的時候见间,不知道各位報考的同學(xué)們是否需要了解以下博士生的生活呢聊闯? 每個人的生活都是不一樣的,每個博士的生活...
    沐_心閱讀 1,817評論 2 3