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