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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

java堆内存与栈内存区别

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

棧(stack):

???? 是一個先進后出的數據結構,通常用于保存方法(函數)中的參數,局部變量. 在java中,所有基本類型和引用類型都在棧中存儲.棧中數據的生存空間一般在當前scopes內(就是由{...}括起來的區域).

???? 棧的優勢是,存取速度比堆要快,僅次于直接位于CPU中的寄存器。但缺點是,存在棧中的數據大小與生存期必須是確定的。所以棧內存中存放的都是方法運行中聲明的基本數據類型,如short,int,long等,他們的長度都是一定的,并且生存期都是隨著方法的結束而結束。

堆(heap):

????? 堆的優勢是可以動態地分配內存大小,生存期也不必事先告訴編譯器,Java的垃圾收集器會自動收走這些不再使用的數據。但缺點是,由于要在運行時動態分配內存,存取速度較慢,C中的malloc語句所產生的內存空間就在堆中. 在java中,所有使用new xxx()構造出來的對象都在堆中存儲,當垃圾回收器檢測到某對象未被引用,則自動銷毀該對象.所以,理論上說java中對象的生存空間是沒有限制的,只要有引用類型指向它,則它就可以在任意地方被使用.堆內存中數據的生存期是由java的回收機制確定的,當棧中沒有引用指向堆中的內存的時候,內存就會被回收。

?

1.寄存器:最快的存儲區, 由編譯器根據需求進行分配,我們在程序中無法控制.?
2. 棧:存放基本類型的變量數據和對象的引用,但對象本身不存放在棧中,而是存放在堆(new 出來的對象)或者常量池中(字符串常量對象存放在常量池中。)?
3. 堆:存放所有new出來的對象。?
4. 靜態域:存放靜態成員(static定義的)?
5. 常量池:存放字符串常量和基本類型常量(public static final)。?
6. 非RAM存儲:硬盤等永久存儲空間?

這里我們主要關心棧,堆和常量池,對于棧和常量池中的對象可以共享,對于堆中的對象不可以共享。棧中的數據大小和生命周期是可以確定的,當沒有引用指向數據時,這個數據就會消失。堆中的對象的由垃圾回收器負責回收,因此大小和生命周期不需要確定,具有很大的靈活性。?
對于字符串:其對象的引用都是存儲在棧中的,如果是編譯期已經創建好(直接用雙引號定義的)的就存儲在常量池中,如果是運行期(new出來的)才能確定的就存儲在堆中。對于equals相等的字符串,在常量池中永遠只有一份,在堆中有多份。?

?

static聲明的代碼,存儲在heap中,常量以外的類(靜態)變量存儲在方法區

轉載于:https://www.cnblogs.com/HelloGuang/p/3623225.html

總結

以上是生活随笔為你收集整理的java堆内存与栈内存区别的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。