日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java堆内存与栈内存区别

發(fā)布時間:2025/3/20 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java堆内存与栈内存区别 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

棧(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。