堆(Heap)和棧(Stack)是平時編程接觸比較多的兩個計算機語言日月,網(wǎng)上相關(guān)介紹內(nèi)容已經(jīng)有很多了,作者在此記錄下我的理解茧妒,也供以后溫故之用郭脂。
1. 棧(Stack)和堆(Heap)的定義
棧:空間小,速度快橘茉,放對象的引用工腋;一個先進后出(Last In First Out )的數(shù)據(jù)結(jié)構(gòu),通常用于保存基本類型畅卓、字面量擅腰、對象的引用變量、自定義變量翁潘。
堆:空間大趁冈,可動態(tài)申請,放所有創(chuàng)建的對象拜马;一個可動態(tài)申請的內(nèi)存空間渗勘,通常用于保存關(guān)鍵字new 構(gòu)造出來的對象,malloc(C/C++)語句所產(chǎn)生的內(nèi)存空間俩莽、數(shù)組
以上定義回答了堆(Heap)和棧(Stack)是什么旺坠,以及它們主要用來干什么(保存什么的),有一個共同點:都是java運行時內(nèi)存中(RAM)存放數(shù)據(jù)的地方扮超。
2. 各自存放數(shù)據(jù)的特點
棧:當java中定義一個變量時取刃,就會在棧內(nèi)存中分配,當運行到超過變量的作用域時出刷,java會自動釋放掉該變量所分配的內(nèi)存空間璧疗,該內(nèi)存空間會另作他用(生命周期)。
堆:在堆中分配的內(nèi)存馁龟,不同語言處理方式不完全相同崩侠,java中由虛擬機的自動回收器來管理,當沒有指向該對象的引用時坷檩,垃圾回收機制在適當?shù)臅r候回收掉却音。
當對象被創(chuàng)建放入堆時,此時有一個棧中的特殊引用變量指向該對象在內(nèi)存中的首地址淌喻,而這個特殊變量被稱為引用變量僧家,在程序中要訪問該對象時通過該引用變量進行訪問!
以上是我的理解裸删,一點一點深入學習中,歡迎指正阵赠!