Java堆、棧、內存的知識

在JAVA中,有六個不同的地方可以存儲數據:

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

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

newString(“China”);
對于通過new產生一個字符串 (假設為”china”)時,會先去常量池中查找是否已經有了”china”對象,如果沒有則在常量池中創建一個此字符串對象,然后堆中再創建一個常量池中此”china”對象的拷貝對象。這也就是有道面試題:Strings = new String(“xyz”);產生幾個對象?一個或兩個,如果常量池中原來沒有”xyz”,就是兩個。

局部變量的數據存在于棧內存中。棧內存中的局部變量隨著方法的消失而消失。(形式參數是局部變量)
成員變量存儲在堆中的對象里面,由垃圾回收器負責回收

Java內存分配中的棧

在函數中定義的一些基本類型的變量數據和對象的引用變量都在函數的棧內存中分配。當在一段代碼塊定義一個變量時,Java在棧中為這個變量分配內存空間,當該變量退出其作用域后,Java會自動釋放掉為該變量所分配的內存空間,該內存空間可以立即被另作他用。棧的優勢是,存取速度比堆要快,僅次于寄存器,棧數據可以共享。但缺點是,存在棧中的數據大小與生存期必須是確定的,缺乏靈活性。

棧有一個很重要的特殊性,就是存在棧中的數據可以共享。假設我們同時定義: int a =3; int b = 3; 編譯器先處理int a = 3;首先它會在棧中創建一個變量為a的引用,然后查找棧中是否有3這個值,如果沒找到,就將3存放進來,然后將a指向3。接著處理int b = 3;在創建完b的引用變量后,因為在棧中已經有3這個值,便將b直接指向3。這樣,就出現了a與b同時均指向3的情況。這時,如果再令a=4;那么編譯器會重新搜索棧中是否有4值,如果沒有,則將4存放進來,并令a指向4;如果已經有了,則直接將a指向這個地址。因此a值的改變不會影響 到b的值。要注意這種數據的共享與兩個對象的引用同時指向一個對象的這種共享是不同的,因為這種情況a的修改并不會影響到b, 它是由編譯器完成的,它有利于節省空間。而一個對象引用變量修改了這個對象的內部狀態,會影響到另一個對象引用變量。

什么是引用變量
引用變量就相當于是為數組或對象起的一個名稱,以后就可以在程序中使用棧中的引用變量來訪問堆中的數組或對象。

回過頭再來看代碼

實際上里面分解成了四個步驟。

Case cc; '''在棧內存里面開辟了空間給引用變量cc,這時cc=null'''
cc=new Case();
'''
1. new Case()在堆內存里面開辟了空間給Case類的對象,這個對象沒有名字
2. Case()隨即調用了Case類的構造函數
3. 把對象的地址在堆內存的地址給引用變量cc

這樣我們就明確了:
Java中,這里的“=”并不是賦值的意思,而是把對象的地址傳遞給變量;
對象創建出來,其實連名字都沒有,因此必須通過引用變量來對其進行操作。

Java內存分配中的堆

堆內存用來存放由new創建的對象和數組。在堆中分配的內存,由Java虛擬機的自動垃圾回收器來管理。在堆中產生了一個數組或對象后,還可以在棧中定義一個特殊的變量,讓棧中這個變量的取值等于數組或對象在堆內存中的首地址,棧中的這個變量就成了數組或對象的引用變量。引用變量就相當于是為數組或對象起的一個名稱,以后就可以在程序中使用棧中的引用變量來訪問堆中的數組或對象。引用變量就相當于是為數組或者對象起的一個名稱。 引用變量是普通的變量,定義時在棧中分配,引用變量在程序運行到其作用域之外后被釋放。而數組和對象本身在堆中分配,即使程序運行到使用 new 產生數組或者對象的語句所在的代碼塊之外,數組和對象本身占據的內存不會被釋放,數組和對象在沒有引用變量指向它的時候,才變為垃圾,不能在被使用,但仍然占據內存空間不放,在隨后的一個不確定的時間被垃圾回收器收走(釋放掉)。這也是 Java 比較占內存的原因。堆的優勢是可以動態地分配內存 大小,生存期也不必事先告訴編譯器,因為它是在運行時動態分配內存的,Java的垃圾收集器會自動收走這些不再使用的數據。但缺點是,由于要在運行時動態分配內存,存取速度較慢。

實際上,棧中的變量指向堆內存中的變量,這就是Java中的指針!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/38094.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/38094.shtml
英文地址,請注明出處:http://en.pswp.cn/news/38094.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

visual studio 2017 運行的程序關閉后不能再運行?(visual studio建立項目之后退出,如何再次完整打開項目?)

在你儲存項目的文件夾里面應該是這樣的 里面.vcxproj后綴名的就是原來創建的項目,直接打開這個頭文件源文件就會一起出來了! 真的管用,親測有效。

可重入鎖,不可重入鎖,死鎖的多種情況,以及產生的原因,如何解決,synchronized采用的鎖策略(渣女圣經)自適應的底層,鎖清除,鎖粗化,CAS的部分應用

一、💛 鎖策略——接上一篇 6.分為可重入鎖,不可重入鎖 如果一個線程,針對一把鎖,連續加鎖兩次,會出現死鎖,就是不可重入鎖,不會出現死鎖,就是可重入鎖。 如果一個線程,針…

用身邊統計學告訴大家ChatGPT聽聞過的、用過的、重度使用的大概有多少?

最近摸魚時,看到有人發帖說信息繭房真的是無處不在。討論一番后,確實是這樣,每個人都在不同程度的“坐井觀天”罷了。拿最近火遍全球的ChatGPT來說,身邊真的不少人聽都沒聽過。這里有個更詳細調查,不過是Sunergia做的&…

全排列——力扣46

文章目錄 題目描述解法:回溯題目描述 解法:回溯 //version 1 vector<vector<int>> permute(<

分類預測 | MATLAB實現GWO-BiGRU-Attention多輸入分類預測

分類預測 | MATLAB實現GWO-BiGRU-Attention多輸入分類預測 目錄 分類預測 | MATLAB實現GWO-BiGRU-Attention多輸入分類預測預測效果基本介紹程序設計參考資料 預測效果 基本介紹 1.GWO-BiGRU-Attention 數據分類預測程序 2.代碼說明&#xff1a;基于灰狼優化算法&#xff08;GW…

Java SE 學習筆記(十)—— 正則表達式

目錄 1 引言2 常用匹配規則2.1 字符類2.2 預定義的字符類2.3 貪婪的量詞 3 正則表達式匹配的 API4 正則表達式應用4.1 正則表達式常見應用案例4.2 正則表達式在字符串方法中的使用4.3 正則表達式爬取信息 1 引言 &#x1f60d; 正則表達式可以用一些規定的字符來制定規則&#…

I2C連續讀寫實現

IIC系列文章: (1)I2C 接口控制器理論講解 (2)I2C接口控制設計與實現 (3)I2C連續讀寫實現 文章目錄 前言一、 i2c_bit_shift 模塊分析二、 i2c_control 模塊實現三、 i2c_control 模塊仿真測試前言 上文的 i2c_bit_shift 模塊說完了,我們發現實現一個字節的寫操作還是可以實現…

【UniApp開發小程序】小程序首頁(展示商品、商品搜索、商品分類搜索)【后端基于若依管理系統開發】

文章目錄 界面效果界面實現工具js頁面首頁讓文字只顯示兩行路由跳轉傳遞對象將商品分為兩列顯示使用中劃線劃掉原價 后端商品controllerservicemappersql 界面效果 【說明】 界面中商品的圖片來源于閑魚&#xff0c;若侵權請聯系刪除關于商品分類頁面的實現&#xff0c;請在我…

MySQL基礎篇

一、MySQL基礎 黑窗口命令操作: 連接MySQL服務器&#xff1a;mysql -u用戶名 -p密碼 [-h數據庫服務器的IP地址 -P端口號] ? -h 參數不加&#xff0c;默認連接的是本地 127.0.0.1 的MySQL服務器 -P 參數不加&#xff0c;默認連接的端口號是 3306 、 **上述指令&#xff0c;可…

建庫、建表、修改表、復制表、字符類型、數值類型、枚舉類型、日期時間類型、檢索目錄、數據導入命令、數據導入步驟、數據導出命令、非空、默認值、唯一索

Top NSD DBA DAY04 案例1&#xff1a;表管理案例2&#xff1a;數據類型案例3&#xff1a;數據批量處理案例4&#xff1a;表頭基本約束 1 案例1&#xff1a;表管理 1.1 問題 建庫練習建表練習修改表練習 1.2 方案 在MySQL50主機完成練習。 1.3 步驟 實現此案例需要按照如…

升級版“斯坦福AI小鎮”來了,這次的AI Agents有點不一樣

文娛是大模型落地的一個重要方向。 數科星球原創 作者丨苑晶 編輯丨大兔 八月中旬&#xff0c;AIGC游戲的風潮撲面而來。在游戲大廠按捺不住投入巨資的背景下&#xff0c;數科星球&#xff08;ID&#xff1a;digital-planet&#xff09;接觸到了多名業內精英也投身于此。人工…

Kafka第一課概述與安裝

生產經驗 面試重點 Broker面試重點 代碼,開發重點 67 章了解 如何記錄行為數據 1. Kafka概述 1.產生原因 前端 傳到日志 日志傳到Flume 傳到HADOOP 但是如果數據特比大&#xff0c;HADOOP就承受不住了 2.Kafka解決問題 控流消峰 Flume傳給Kafka 存到Kafka Hadoop 從Kafka…

Qt掃盲-Qt Paint System 概述

Qt Paint System 概述 一、概述二、繪圖設備和后端1. Widget2. Image3. Pixmap4. OpenGL繪制設備5. Picture6. 自定義繪制后端 三、繪圖與填充1. Drawing2. 填充 Filling 四、坐標系統1. 渲染Window-Viewport轉換 五、讀寫圖像文件1. QMovie 六、繪圖相關設備 一、概述 Qt的pa…

【數據庫】P2 SELECT 與 SQL注釋

SELECT 檢索單個列檢索多個列檢索所有列不重復的結果 DISTINCT限制結果 LIMIT 與 OFFSET注釋行內注釋多行注釋 檢索單個列 從 Products 表中檢索一個名為 prod_name 的列&#xff1b; SELECT prod_name FROM Products;【1】返回的數據可能是無序的&#xff0c;除非規定了順序…

7.5.tensorRT高級(2)-RAII接口模式下的生產者消費者多batch實現

目錄 前言1. RAII接口模式封裝生產者消費者2. 問答環節總結 前言 杜老師推出的 tensorRT從零起步高性能部署 課程&#xff0c;之前有看過一遍&#xff0c;但是沒有做筆記&#xff0c;很多東西也忘了。這次重新擼一遍&#xff0c;順便記記筆記。 本次課程學習 tensorRT 高級-RAI…

原生JS手寫掃雷小游戲

場景 實現一個完整的掃雷游戲需要一些復雜的邏輯和界面交互。我將為你提供一個簡化版的掃雷游戲示例&#xff0c;幫助你入門。請注意&#xff0c;這只是一個基本示例&#xff0c;你可以根據自己的需求進行擴展和改進。 思路 創建游戲板&#xff08;Grid&#xff09;&#xff1…

軟考:中級軟件設計師:文件管理,索引文件結構,樹型文件結構,位示圖,數據傳輸方式,微內核

軟考&#xff1a;中級軟件設計師: 提示&#xff1a;系列被面試官問的問題&#xff0c;我自己當時不會&#xff0c;所以下來自己復盤一下&#xff0c;認真學習和總結&#xff0c;以應對未來更多的可能性 關于互聯網大廠的筆試面試&#xff0c;都是需要細心準備的 &#xff08;1…

小森動畫回憶錄(二)-瀏覽哆啦a夢的四次元口袋

// DoraemonProps結構用于存儲單個道具信息 struct DoraemonProps{// 道具名稱string name;// 道具用途string UseOfProps; };// 從文件加載哆啦A夢道具信息到vector void LoadDoraemonProps(vector<DoraemonProps>& DoraemonProps) {// 創建文件輸入流ifstream str…

人臉識別技術應用安全管理規定(試行)

近年來&#xff0c;人臉識別技術不斷成熟&#xff0c;已大量應用于治安管理、金融支付、門禁考勤等諸多領域&#xff0c;極大便捷了公眾生活。然而&#xff0c;人臉識別技術在得到廣泛應用的同時&#xff0c;仍存在一些不規范現象。人臉識別因其技術特點&#xff0c;涉及公眾敏…

node.js 基礎高并發案例

什么是高并發 高并發是指系統在同一時間段內需要處理大量的并發請求或同時進行大量的操作。在計算機領域中&#xff0c;高并發通常指的是在短時間內有大量的用戶或客戶端同時訪問系統或進行操作&#xff0c;對系統的并發處理能力提出了較高的要求。 高并發的特點包括 大量的…