java堆内存与栈内存区别
棧(stack):
???? 是一個(gè)先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu),通常用于保存方法(函數(shù))中的參數(shù),局部變量. 在java中,所有基本類型和引用類型都在棧中存儲(chǔ).棧中數(shù)據(jù)的生存空間一般在當(dāng)前scopes內(nèi)(就是由{...}括起來的區(qū)域).
???? 棧的優(yōu)勢(shì)是,存取速度比堆要快,僅次于直接位于CPU中的寄存器。但缺點(diǎn)是,存在棧中的數(shù)據(jù)大小與生存期必須是確定的。所以棧內(nèi)存中存放的都是方法運(yùn)行中聲明的基本數(shù)據(jù)類型,如short,int,long等,他們的長(zhǎng)度都是一定的,并且生存期都是隨著方法的結(jié)束而結(jié)束。
堆(heap):
????? 堆的優(yōu)勢(shì)是可以動(dòng)態(tài)地分配內(nèi)存大小,生存期也不必事先告訴編譯器,Java的垃圾收集器會(huì)自動(dòng)收走這些不再使用的數(shù)據(jù)。但缺點(diǎn)是,由于要在運(yùn)行時(shí)動(dòng)態(tài)分配內(nèi)存,存取速度較慢,C中的malloc語句所產(chǎn)生的內(nèi)存空間就在堆中. 在java中,所有使用new xxx()構(gòu)造出來的對(duì)象都在堆中存儲(chǔ),當(dāng)垃圾回收器檢測(cè)到某對(duì)象未被引用,則自動(dòng)銷毀該對(duì)象.所以,理論上說java中對(duì)象的生存空間是沒有限制的,只要有引用類型指向它,則它就可以在任意地方被使用.堆內(nèi)存中數(shù)據(jù)的生存期是由java的回收機(jī)制確定的,當(dāng)棧中沒有引用指向堆中的內(nèi)存的時(shí)候,內(nèi)存就會(huì)被回收。
?
1.寄存器:最快的存儲(chǔ)區(qū), 由編譯器根據(jù)需求進(jìn)行分配,我們?cè)诔绦蛑袩o法控制.?
2. 棧:存放基本類型的變量數(shù)據(jù)和對(duì)象的引用,但對(duì)象本身不存放在棧中,而是存放在堆(new 出來的對(duì)象)或者常量池中(字符串常量對(duì)象存放在常量池中。)?
3. 堆:存放所有new出來的對(duì)象。?
4. 靜態(tài)域:存放靜態(tài)成員(static定義的)?
5. 常量池:存放字符串常量和基本類型常量(public static final)。?
6. 非RAM存儲(chǔ):硬盤等永久存儲(chǔ)空間?
這里我們主要關(guān)心棧,堆和常量池,對(duì)于棧和常量池中的對(duì)象可以共享,對(duì)于堆中的對(duì)象不可以共享。棧中的數(shù)據(jù)大小和生命周期是可以確定的,當(dāng)沒有引用指向數(shù)據(jù)時(shí),這個(gè)數(shù)據(jù)就會(huì)消失。堆中的對(duì)象的由垃圾回收器負(fù)責(zé)回收,因此大小和生命周期不需要確定,具有很大的靈活性。?
對(duì)于字符串:其對(duì)象的引用都是存儲(chǔ)在棧中的,如果是編譯期已經(jīng)創(chuàng)建好(直接用雙引號(hào)定義的)的就存儲(chǔ)在常量池中,如果是運(yùn)行期(new出來的)才能確定的就存儲(chǔ)在堆中。對(duì)于equals相等的字符串,在常量池中永遠(yuǎn)只有一份,在堆中有多份。?
?
static聲明的代碼,存儲(chǔ)在heap中,常量以外的類(靜態(tài))變量存儲(chǔ)在方法區(qū)
轉(zhuǎn)載于:https://www.cnblogs.com/HelloGuang/p/3623225.html
總結(jié)
以上是生活随笔為你收集整理的java堆内存与栈内存区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: DP 之 poj 2229
- 下一篇: 司以类聚,人以群分
