極速版:棧的內存/局部變量表/堆的內存細分

1. 棧的存儲

每個線程都有自己的棧,棧中數據以棧幀(Stack Frame)為基本單位

線程上正在執行的每個方法都各自對應一個棧楨(Stack Frame)

棧楨是一個內存區塊,是一個數據集,維系著方法執行過程中的各種數據信息

JVM 對棧的操作有兩個:壓棧與出棧,遵循“新進后出”或“后進先出”原則

1.1 當前棧幀

一條活動線程中,一個時間點上,只會有一個活動的棧幀。

即當前執行的方法的棧幀(棧頂棧幀)是有效的,被稱為當前棧幀。

1.2 當前方法

與當前棧幀對應的方法是當前方法

1.3 當前類

當前方法所在的類就是當前類

1.4 代碼測試

執行引擎運行的所有字節碼指令只針對當前棧幀操作

若在該方法中調用了其他方法,對應新的棧幀就會被創建出來,

放在站的頂端,成為新的棧幀

測試:方法 1 調用方法 2 ,方法?2 調用 3 ,方法 3 結束;

調用方法 1 時,方法 1 對應的棧幀為當前棧幀;

調用方法 2?時,方法 2?對應的棧幀為當前棧幀;

調用方法 3?時,方法 3?對應的棧幀為當前棧幀;

方法 3 執行完畢,方法 2 對應的棧幀為當前棧幀;

方法 2?執行完畢,方法 1?對應的棧幀為當前棧幀;

public class StackStruTest {public static void main(String[] args) {StackStruTest stackStruTest = new StackStruTest();stackStruTest.method1();}public void method1(){System.out.println("method1 開始執行");method2();System.out.println("method1 執行結束");}public void method2(){System.out.println("method2 開始執行");method3();System.out.println("method2 執行結束");}public void method3(){System.out.println("method3 開始執行");System.out.println("method3 執行結束");}
}
method1 開始執行
method2 開始執行
method3 開始執行
method3 執行結束
method2 執行結束
method1 執行結束
1.5 運行原理

不同線程中包含的棧幀不允許相互引用

方法的結束(棧幀彈出):

? ? ? ? ① 正常結束,以 return 為代表

? ? ? ? ② 異常結束:方法執行中出現未捕獲處理的異常,以拋出異常的方式結束

2. 棧的內部結構

棧幀入棧:表示方法調用

棧幀出棧:表示方法結束

棧幀是有大小的,

其大小取決于棧幀內部的結構

棧幀五大部分:

? ? ? ? 局部變量表(Local Variables)

? ? ? ? 操作數棧(Operand Stack)(或表達式棧)

? ? ? ? 動態鏈接(Dynamic Linking)(或指向運行時常量池的方法引用)

? ? ? ? 方法返回地址(Return Address)(或方法正常退出/異常退出的定義)

? ? ? ? 一些附加信息

2.1 局部變量表?

又被稱為局部變量數組或本地變量表

定義為一個數字數組,主要用于存儲方法參數和定義在方法體內的局部變量

局部變量表存儲在建立線程的棧上,每個方法都有對應的各自的棧幀,因此不存在數據安全問題

局部變量表所需的容量大小是在編譯期確定下來的

方法嵌套調用的次數由棧的大小決定。一般來說,棧越大,方法嵌套調用次數越多

局部變量表中的變量只在當前方法調用中有效

當方法調用結束后,隨著方法棧楨的銷毀,局部變量表也會隨之銷毀

3. 堆

一個 JVM 實例 只存在一個堆內存,堆也是 Java 內存管理的核心區域

Java 堆區在 JVM?啟動的時候被創建,其空間大小也就確定

堆是 JVM 管理的最大一塊內存空間

? ? ? ? 堆的大小可以調節

堆可以處于物理上不連續的內存空間中,但在邏輯上它應該被視為連續的

所有的線程共享 Java 堆,堆里還可以劃分線程私有的緩沖區(Thread Local Allocation?Buffer,TLAB)[多個線程共享堆,易出現并發性,為避免,可再劃分為緩沖區]

幾乎所有的對象實例以及數組都應當在運行時分配在堆上。

數組和對象可能永遠不會存儲在棧上;

在方法結束后,堆中的對象幾乎不會被馬上移除,僅僅在垃圾收集的時候才會被移除

堆,是GC(global collection,垃圾回收器),執行垃圾回收的重點區域

3.1 內存細分

新生區 == 新生代 == 年輕代

養老區 == 老年區?== 老年代

永久區 = 永久代

堆空間暫時只包含兩部分:新生代,老年代

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

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

相關文章

【操作系統】內存泄漏 vs 內存碎片

【操作系統】內存泄漏 vs 內存碎片 內存泄漏(Memory Leak) vs 內存碎片(Memory Fragmentation)1. 內存泄漏(Memory Leak)2. 內存碎片(Memory Fragmentation)3. 內存泄漏 vs 內存碎片…

力扣HOT100之矩陣:73. 矩陣置零

這道題我沒有想到什么好的辦法,直接暴力AC了,直接遍歷兩次矩陣,第一次遍歷用兩個向量分別記錄出現0的行數和列數,第二次遍歷就判斷當前的元素的行數或者列數是否出現在之前的兩個向量中,若出現了就直接置零&#xff0c…

?Flink/Kafka在python中的用處

一、基礎概念 1. ?Apache Kafka 是什么? ?核心功能:Kafka 是一個分布式流處理平臺,主要用于構建實時數據管道和流式應用程序。?核心概念: ?生產者(Producer)?:向 Kafka 發送數據的程序。…

推薦系統(十八):優勢特征蒸餾(Privileged Features Distillation)在商品推薦中的應用

在商品推薦系統中,粗排和精排環節的知識蒸餾方法主要通過復雜模型(Teacher)指導簡單模型(Student)的訓練,以提升粗排效果及與精排的一致性。本文將以淘寶的一篇論文《Privileged Features Distillation at …

深度學習四大核心架構:神經網絡(NN)、卷積神經網絡(CNN)、循環神經網絡(RNN)與Transformer全概述

目錄 📂 深度學習四大核心架構 🌰 知識點概述 🧠 核心區別對比表 ? 生活化案例理解 🔑 選型指南 📂 深度學習四大核心架構 第一篇: 神經網絡基礎(NN) 🌰 知識點概述…

R語言對偏態換數據進行轉換(對數、平方根、立方根)

我們進行研究的時候經常會遇見偏態數據,數據轉換是統計分析和數據預處理中的一項基本技術。使用 R 時,了解如何正確轉換數據有助于滿足統計假設、標準化分布并提高分析的準確性。在 R 中實現和可視化最常見的數據轉換:對數、平方根和立方根轉…

第十四屆藍橋杯省賽電子類單片機學習記錄(客觀題)

01.一個8位的DAC轉換器,供電電壓為3.3V,參考電壓2.4V,其ILSB產生的輸出電壓增量是(D)V。 A. 0.0129 B. 0.0047 C. 0.0064 D. 0.0094 解析: ILSB(最低有效位)的電壓增量計算公式…

HarmonyOSNext_API16_媒體查詢

媒體查詢條件詳解 媒體查詢是響應式設計的核心工具,通過判斷設備特征動態調整界面樣式。其完整規則由媒體類型、邏輯操作符和媒體特征三部分組成,具體解析如下: 一、媒體查詢語法結構 基本格式: [媒體類型] [邏輯操作符] (媒體特…

Python+拉普拉斯變換求解微分方程

引言 在數學和工程學中,微分方程廣泛應用于描述動態系統的行為,如電路、電氣控制系統、機械振動等。求解微分方程的一個常見方法是使用拉普拉斯變換,尤其是在涉及到初始條件時。今天,我們將通過 Python 演示如何使用拉普拉斯變換來求解微分方程,并幫助大家更好地理解這一…

【算法】手撕快速排序

快速排序的思想 任取一個元素作為樞軸,然后想辦法把這個區間劃分為兩部分,小于等于樞軸的放左邊,大于等于樞軸的放右邊 然后遞歸處理左右區間,直到空或只剩一個 具體動畫演示詳見 數據結構合集 - 快速排序(算法過程, 效率分析…

《八大排序算法》

相關概念 排序:使一串記錄,按照其中某個或某些關鍵字的大小,遞增或遞減的排列起來。穩定性:它描述了在排序過程中,相等元素的相對順序是否保持不變。假設在待排序的序列中,有兩個元素a和b,它們…

深度學習篇---paddleocr正則化提取

文章目錄 前言一、代碼總述&介紹1.1導入必要的庫1.1.1cv21.1.2re1.1.3paddleocr 1.2初始化PaddleOCR1.3打開攝像頭1.4使用 PaddleOCR 進行識別1.5定義正則表達式模式1.6打印提取結果1.7異常處理 二、正則表達式2.1簡介2.2常用正則表達式模式及原理2.2.1. 快遞單號模式2.2.2…

JavaScript DOM與元素操作

目錄 DOM 樹、DOM 對象、元素操作 一、DOM 樹與 DOM 對象 二、獲取 DOM 元素 1. 基礎方法 2. 現代方法(ES6) 三、修改元素內容 四、修改元素常見屬性 1. 標準屬性 2. 通用方法 五、通過 style 修改樣式 六、通過類名修改樣式 1. className 屬…

單元測試的編寫

Python 單元測試示例 在 Python 中,通常使用 unittest 模塊來編寫單元測試。以下是一個簡單的示例: 示例代碼:calculator.py # calculator.py def add(a, b):return a bdef subtract(a, b):return a - b 單元測試代碼:test_c…

大模型學習:從零到一實現一個BERT微調

目錄 一、準備階段 1.導入模塊 2.指定使用的是GPU還是CPU 3.加載數據集 二、對數據添加詞元和分詞 1.根據BERT的預訓練,我們要將一個句子的句頭添加[CLS]句尾添加[SEP] 2.激活BERT詞元分析器 3.填充句子為固定長度 代碼解釋: 三、數據處理 1.…

10組時尚復古美學自然冷色調肖像電影照片調色Lightroom預設 De La Mer – Nautical Lightroom Presets

De La Mer 預設系列包含 10 種真實的調色預設,適用于肖像、時尚和美術。為您的肖像攝影帶來電影美學和個性! De La Mer 預設非常適合專業人士和業余愛好者,可在桌面或移動設備上使用,為您的攝影項目提供輕松的工作流程。這套包括…

SDL多窗口多線程渲染技術解析

SDL多窗口多線程渲染技術解析 技術原理 SDL多線程模型與窗口管理 SDL通過SDL_Thread結構體實現跨平臺線程管理。在多窗口場景中,每個窗口需關聯獨立的渲染器,且建議遵循以下原則: 窗口與渲染器綁定:每個窗口創建時生成專屬渲染器(SDL_CreateRenderer),避免跨線程操作…

QT 跨平臺發布指南

一、Windows 平臺發布 1. 使用 windeployqt 工具 windeployqt --release --no-compiler-runtime your_app.exe 2. 需要包含的文件 應用程序 .exe 文件 Qt5Core.dll, Qt5Gui.dll, Qt5Widgets.dll 等 Qt 庫 platforms/qwindows.dll 插件 styles/qwindowsvistastyle.dll (如果使…

L2-037 包裝機 (分數25)(詳解)

題目鏈接——L2-037 包裝機 問題分析 這個題目就是模擬了物品在傳送帶和筐之間的傳送過程。傳送帶用隊列模擬,筐用棧模擬。 輸入 3 4 4 GPLT PATA OMSA 3 2 3 0 1 2 0 2 2 0 -1輸出 根據上述操作,輸出的物品順序是: MATA樣例分析 初始…

機器學習的一百個概念(4)下采樣

前言 本文隸屬于專欄《機器學習的一百個概念》,該專欄為筆者原創,引用請注明來源,不足和錯誤之處請在評論區幫忙指出,謝謝! 本專欄目錄結構和參考文獻請見[《機器學習的一百個概念》 ima 知識庫 知識庫廣場搜索&…