JAVA的內存圖理解

目錄

  • 一、方法區
    • 1、類常量池
    • 2、靜態常量池
    • 3、方法區過程
  • 二、棧
  • 三、堆
    • 1、字符常量池
    • 2、堆內存圖的繪制

java中內存可以分為 方法區程序計數器本地方法棧,其中比較中重要的是方法區、堆、棧。

一、方法區

1.方法區(Method Area)與Java堆一樣,是各個線程共享的內存區域。

2.方法區在JVM啟動的時候被創建,并且它的實際的物理內存空間中和Java堆區一樣都可以是不連續的。
3.方法區的大小,跟堆空間一樣,可以選擇固定大小或者可擴展。
4.方法區的大小決定了系統可以保存多少個類,加載項目中的類同時將類中的方法和屬性加載到方法區當中
5.關閉JVM就會釋放這個區域的內存。
提供兩個類Person和Test類,其中Person類定義如下:

package 內存圖;public class Person {public int age;public String name;public static int flag;public void m1() {}public static void m2() {}@Overridepublic String toString() {return "Person [age=" + age + ", name=" + name + " flag = "+flag+"]";}}

Test類定義如下:

package 內存圖;public class Test {public static void main(String[] args) {Person x1 = new Person();x1.age = 20;x1.name = "11";x1.flag = 1;Person x2 = new Person();x2.age = 22;x2.name="22";x2.flag = 2;System.out.println(x1);System.out.println(x2);change1(x1,x2);System.out.println(x1);System.out.println(x2);change2(x1,x2);System.out.println(x1);System.out.println(x2);}public static void change1(Person a,Person b) {Person temp = a;a=b;b=temp;}public static void change2(Person a,Person b) {int temp_age = a.age;String temp_name = a.name;a.age = b.age;a.name = b.name;b.age = temp_age;b.name = temp_name;}
}

分析上述的兩個類中的情況:
Person:
屬性:age(int)name(String)flag(static int)
方法:m1(),m2()(Static) ,toString()
Test:
屬性:空
方法:main()(static),change1(Peson a,Person b),change2(Person a,Person b)(static)

1、類常量池

類常量池里面存儲的是類的信息,其中存儲java類中的方法和屬性即上述的Person和Test類。其中存儲的情況如下:
其中被static靜態定義的方法和屬性標記為紅色,此時內存沒有給類分配內存地空間,因此其中定義的方法和屬性由于沒有分配內存空間不可以被使用(static定義的方法和屬性除外。)
在這里插入圖片描述

2、靜態常量池

靜態常量池用于存儲類常量池中被static修飾過的方法和屬性,并且為這些方法和屬性分配內存空間,因此屬性被分配內存空間后,屬性會存在其類型的默認值
在這里插入圖片描述

3、方法區過程

在這里插入圖片描述
類被加載到類常量池中并且獲得其中的方法和屬性,但是此時沒有給方法和屬性分配內存空間,即對象沒有被定義時無法獲得其中的沒有被static修飾過的方法和屬性,被static修飾過的會被分配內存空間,即使沒有創建對象的時候仍可以使用其中的方法和屬性

二、棧

棧有一個特點為后入先出,首先被加載到棧中的方法最后出棧,最后入棧的方法,最先出棧。main()為程序的入口,因此棧中首先加載main()方法,直到方法結束。
main()方法中的執行代碼如下:

	Person x1 = new Person();x1.age = 20;x1.name = "11";x1.flag = 1;Person x2 = new Person();x2.age = 22;x2.name="22";x2.flag = 2;System.out.println(x1);System.out.println(x2);change1(x1,x2);System.out.println(x1);System.out.println(x2);change2(x1,x2);System.out.println(x1);System.out.println(x2);

根據main()方法中創建變量,創建變量如下:由于x1和x2都是非基本數據類型,因此變量中存儲的是堆中的內存地址。,當方法出棧之后,變量也會被回收。
在這里插入圖片描述
并且main()中的方法按照順序依次執行,遇到變量時會創建變量,遇到方法時會將方法加入到棧當中。
當方法全部入棧之后:
在這里插入圖片描述
根據后入先出:
在這里插入圖片描述
最后:main()方法出棧,棧空
在這里插入圖片描述

三、堆

堆內存通常有較大的空間供程序使用,其大小受限于系統的有效虛擬內存,除基礎類型以外的復雜數據類型的創建都在堆中操作,由堆分配內存空間供變量使用,例如數組、對象、字符串、列表

1、字符常量池

字符串常量池是Java中一個重要的概念,用于優化字符串的存儲和使用。它的主要目的是提高性能和減少內存開銷。在字符串定義時,為了避免重復定義浪費空間,創建字符常量池,每一次定義字符串時會判斷字符常量池中是否包含該字符串,如果包含會直接將其內存地址賦值給變量名,不存在時會在字符常量池中創建,被創建的字符串在未被使用時不會被立刻回收。

2、堆內存圖的繪制

經過下面的代碼之后,堆中會創建出下面的情況

		Person x1 = new Person();x1.age = 20;x1.name = "11";x1.flag = 1;

在這里插入圖片描述
因為flag位于靜態常量池當中,因此創建的對象實例中不包含flag,修改時會直接修改靜態常量池中的flag。
在這里插入圖片描述

		Person x2 = new Person();x2.age = 22;x2.name="22";x2.flag = 2;System.out.println(x1);System.out.println(x2);

經過上面的代碼之后,堆中會創建出下面的情況:
在這里插入圖片描述
并且會打印x1和x2。

		change1(x1,x2);System.out.println(x1);System.out.println(x2);

經過上面的代碼之后,棧中會載入change1()的方法,堆中會創建出下面的情況:
在這里插入圖片描述
此時x1和x2中的并未發生交換,方法結束后會消除該方法。

		change2(x1,x2);System.out.println(x1);System.out.println(x2);

在這里插入圖片描述
結束后效果如下:
在這里插入圖片描述
x1和x2中的age和name發生交換。

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

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

相關文章

基于Selenium的IEEE Xplore論文數據爬取實戰指南

基于Selenium的IEEE Xplore論文數據爬取實戰指南 一、項目背景與目標 IEEE Xplore作為全球知名的學術資源平臺,收錄了大量高質量科技文獻。本教程將演示如何通過Python的Selenium庫實現: 自動化獲取指定領域論文列表(以"構音障礙"為例)完整提取論文標題、摘要、…

軟件工程面試題(十二)

1、文件和目錄(i/o)操作,怎么列出某目錄下所有文件?某目錄下所有子目錄,怎么判斷文件或目錄是否存在?如何讀寫文件? 列出某目錄下所有文件:調用listFile(),然后判斷每個File對象是否是文件可以調用 isFile(),判斷是否是文件夾可以調用isDirectory(),判斷文件或目…

醫療CMS高效管理:簡化更新維護流程

內容概要 醫療行業內容管理系統(CMS)的核心價值在于應對醫療信息管理的多維復雜性。面對診療指南的動態更新、科研數據的快速迭代以及多機構協作需求,傳統管理模式往往面臨效率瓶頸與合規風險。現代化醫療CMS通過構建結構化權限管理矩陣&…

談談Minor GC、Major GC和Full GC

目錄 一、背景 二、三者之間的區分 1、Minor GC 2、Major GC (1)老年代空間不足: (2)晉升(Promotion)失敗: (3)空間分配擔保失敗: &#x…

C盤清理技巧分享:PE Dism++ 空間清理篇

C盤清理技巧分享:PE & Dism 空間清理篇 C盤空間不足是許多用戶面臨的常見問題,尤其是在使用 Windows 系統時。本文將重點介紹如何使用 PE(Preinstallation Environment)和 Dism 工具高效清理 C盤空間,釋放寶貴的存…

低功耗LPWAN模塊開發指南:遠距離無線通信與邊緣計算融合實戰?

在遠程資產追蹤、野外環境監測等場景中,穩定可靠的長距離通信與超低功耗是系統設計的核心挑戰。eFish-SBC-RK3576通過 ?原生雙UART接口 USB OTG擴展能力? ,可無縫集成主流LPWAN模組(LoRa/NB-IoT),實現“數據采集-邊…

迅為iTOP-RK3576人工智能開發板Android 系統接口功能測試

2.1 開機啟動 開發板接通電源,并按下電源開關,系統即啟動,在啟動過程中,系統會顯示下圖中的開機畫面,它們分別是 Android 系統啟動時的 Logo 畫面: 最后會顯示如下解鎖畫面: 2.2 命令終端 將…

RAG基建之PDF解析的“無OCR”魔法之旅

PDF文件轉換成其他格式常常是個大難題,大量的信息被鎖在PDF里,AI應用無法直接訪問。如果能把PDF文件或其對應的圖像轉換成結構化或半結構化的機器可讀格式,那就能大大緩解這個問題,同時也能顯著增強人工智能應用的知識庫。 嘿,各位AI探險家們!今天我們將踏上了一段奇妙的…

二層框架組合實驗

實驗要求: 1,內網IP地址使用172.16.0.0/16分配 2,SW1和sw2之間互為備份 3,VRRP/STP/VLAN/Eth-trunk均使用 4,所有PC均通過DHCP獲取IP地址 5,ISP只能配置IP地址 6,所有電腦可以正常訪問ISP路由器環回 實驗思路順序: 創建vlan eth-trunk 劃分v…

光纖耦合器

以下是關于光纖耦合器的詳細介紹: 定義與原理 - 定義:光纖耦合器是一種能使傳輸中的光信號在特殊結構的耦合區發生耦合,并進行再分配的器件,也叫分歧器、連接器、適配器、光纖法蘭盤。 - 原理:利用不同光纖面緊鄰光纖芯…

惠普(HP)和聯想(Lenovo)作為全球兩大電腦品牌,并不是簡單的“拼接電腦”

惠普(HP)和聯想(Lenovo)作為全球兩大電腦品牌,并不是簡單的“拼接電腦”,它們都有自己的核心技術、專利設計和生態體系。以下是它們“自己的”核心部分: 1. 關鍵自研技術 品牌自研技術/專利說明…

若依賴前端處理后端返回的錯誤狀態碼

【背景】 后端新增加了一個過濾器,用來處理前端請求中的session 若依賴存放過濾器的目錄:RuoYi-Vue\ruoyi-framework\src\main\java\com\ruoyi\framework\security\filter\ 【問題】 后端返回了一個狀態碼為403的錯誤,現在前端需要處理這…

智能的數學公式:Intelligence = Priori knowledge * Reasoning ?

愛因斯坦的相對論公式大道至簡, 假如智能有公式的話,會不會是: 其中,兩個影響因子分別是先驗知識 和 推理能力,推理能力的指數部分可以是整數也是小數,但是暫時還不好確定。 解析:&#xff08…

簡單使用LlamaIndex實現RAG

簡單使用LlamaIndex實現RAG 1 介紹 LlamaIndex是一個專門為大語言模型(LLM)設計的開源數據管理工具,旨在簡化和優化LLM在外部數據源中的查詢過程。適合在數據索引上構建RAG。 參考的地址 # 官網地址 https://docs.llamaindex.ai/en/stabl…

Redis延時隊列在訂單超時未報到場景的應用補充說明

一、工具類設計要點解析 連接保活機制 Scheduled(cron "0 */10 * * * ?") 定時任務每10分鐘向所有隊列發送心跳消息("keepAlive"),避免云Redis因空閑斷開連接。這是針對云服務商自動回收空閑連接的通用解決方案1。 泛…

理解Kubernetes中CoreDNS域名解析與DNS策略

CoreDNS是什么 CoreDNS是一個靈活可擴展的DNS服務器,使用Go語言編寫,旨在提供快速、靈活的DNS服務 為什么需要CoreDNS CoreDNS為Kubernetes集群內部的DNS解析提供服務,使得服務之間能夠通過域名互相通信 Kubernetes集群中, CoreDNS是運行在…

日報日報流量分析

快捷鍵 CtrlK,選擇需要抓包的網卡 CtrlF可以進行關鍵字搜索 CtrlM,標記數據包 CtrlShiftN跳到標記處 查看包有多少協議Protocol Hierarchy(協議分級) 搜了一下TCP協議,是互聯網最基本的協議&#xff0…

docker-Dify外接Fastgpt知識庫

參考地址:https://mp.weixin.qq.com/s/crQrneHZ0sT-c04YanofSw 總體步驟 部署fda(fastgpt-dify-adapter)docker 部署dify,fastgpt在fastgpt創建open apikey,復制知識庫id;在dify外接fastgpt知識庫; docker安裝 下載…

藍橋杯 之 圖論基礎+并查集

文章目錄 習題聯盟X藍橋幼兒園 圖論基礎 并查集 并查集,總的來說,操作分為三步初始化(每一個節點的父親是自己),定義union(index1,index2)函數,定義find(index)函數 并查集詳細內容博客 習題 聯盟X 聯盟X 典型的求解連通分支…

JavaScript運算符與邏輯中斷

目錄 JavaScript運算符 一、運算符分類與優先級 1. 運算符優先級表 二、算術運算符 1. 基礎算術運算 2. 自增/自減運算符 三、比較運算符 1. 基礎比較 2. 相等性判斷 四、邏輯運算符 1. 基礎邏輯運算 2. 短路求值(Short-Circuiting) 3. 邏輯…