關于JVM和OS中的棧幀的區別和內存淺析

關于JVM和OS中的棧幀的區別和內存淺析


剛看了黑馬JVM中的棧幀的講解,感覺和自己理解的棧幀有一定出入,查詢資料研究了一下發現的確有天壤之別,可惜黑馬并沒有講。

故寫下這篇文章鞏固一下,


OS的棧幀:

? OS的棧幀會在調用一個函數時,分配一段內存,存入函數調用的局部變量、參數、返回地址等信息進去,列如下面這一段C程序:

#include<stdio.h>
int add1(int a, int b) {return add2(a,b);
}
int add2(int a, int b) {return a + b;
}
void main(){add1(1,2);
}

首先,程序會把這個代碼從上開始執行

當執行到main函數時,會在內存上分配如下:
在這里插入圖片描述

這里的返回地址指的是進入這個函數的指令地址,也就是**程序計數器(PC)**寄存器,里面保存的是下一條被執行的語句的位置,因為你調用了函數,PC就得移到函數代碼的地方,為了執行完函數能回到原代碼,就會在函數的棧幀里面保存返回地址,這樣執行完函數就會通過返回地址返回到原本的地方繼續執行。


接著進入add1,add2就顯而易見:
在這里插入圖片描述

棧幀是用棧來存儲的,遵循先進先出,程序只能操作最頂上的棧幀!

每當執行到一個函數,就會創建一個棧幀,存儲變量和對應返回地址,當執行完畢后,棧幀會被回收

這也就是為什么函數需要預先聲明要用的變量的原因,計算機需要知道你的大小和所需來為你分配合適的棧幀。

你只能使用你棧幀里面的數據,一旦越界訪問就會報錯

總的來說,棧幀在OS里面會保存函數執行的一切信息,包括變量對象,返回地址,各種參數

但對于全局變量,以及類似于C++中的vector這種動態申請空間的,棧幀里面只會存對其的內存地址(可以理解為指針),實際上其處于另一片區域中,具體看程序內存分配的總體圖
在這里插入圖片描述

這也被稱為內存五大區:棧區 -> 堆區 -> 全局靜態區 -> 常量區 -> 代碼區

各個區解釋如下:

內核區,是OS的系統文件或其他文件,反正不應該被程序觸碰到,接觸到就會報錯

棧區,也就是上文提到的棧幀存放處,從上到下存儲!

堆區, 存儲程序手動分配的空間,也就是new,vector此類,讀取較慢

全局區,存儲全局變量

常量區,存儲常量

代碼區,存儲原代碼

保留區,4k大小,不作操作

對于32位計算機,全部部分加起來一共有4G

棧區是從上到下使用,堆區是從下到上

緩存區用來作緩沖,雙方都能使用

一旦沖突,便會發生溢出錯誤

以上是OS中棧幀的簡單解釋


JVM的棧幀:

Java這種高級語言的棧幀和OS中的棧幀是兩個東西

本質是JVM抽象出來的,和OS的棧幀沒有關系

但是結構差不多,可以說較為相似
在這里插入圖片描述

(來自小林coding)

這里的本地方法指的是native方法,不是由java實現的方法!是由C語言實現的來對底層進行交互的方法!

那本地方法棧完全可以套用前文

對于Java虛擬機棧幀,僅和OS棧幀有一點區別:其不會把數據對象存儲在棧幀中,而是只會存儲一個引用!

對象本身是存在堆中的,和OS的棧幀不同

對于static的變量和方法,static方法在內存上的存儲方式其實和非static沒有多大區別,都是同樣的創建棧幀調用,只是會少一個this指針,綁定在static中,不能實現多態,可以直接調用

static變量則會直接保存在方法區,不像非staic變量存儲在堆里面

堆是 JVM 中最大的一塊內存區域,被所有線程共享,在虛擬機啟動時創建,用于存放對象實例。

程序計數器(PC)效果和OS相同,都是存儲下一條該執行的語句的地址

元空間用于存儲已被虛擬機加載的類信息、常量、靜態變量等數據

直接內存不屬于 JVM 運行時數據區的一部分,通過 NIO 類引入,是一種堆外內存,可以顯著提高 I/O 性能。


總的來說,JVM和OS的內存管理結構上其實并沒有很大區別,只是需要注意,JVM的內存是對OS的內存的一次抽象,是間接實現的,不是像OS那樣通過匯編直接實現.

所以說既然不是直接實現的,那就必然會對性能有影響,這也是java性能不如C的原因之一

棧幀也是對OS的棧幀的模擬,區別在于不會把所有對象都放在棧幀中,而是放在堆中,這是和OS的區別

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

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

相關文章

Python FastApi(7):請求體

1 多個參數 1.1 混合使用 Path、Query 和請求體參數 首先&#xff0c;毫無疑問地&#xff0c;你可以隨意地混合使用 Path、Query 和請求體參數聲明&#xff0c;FastAPI 會知道該如何處理。你還可以通過將默認值設置為 None 來將請求體參數聲明為可選參數&#xff1a; from ty…

告別枯燥工作,走向自動化

嘿&#xff0c;小伙伴們&#xff01;今天給你們介紹兩款超實用的RPA辦公自動化軟件&#xff0c;用它們&#xff0c;再也不用像機器一樣做重復勞動啦&#xff0c;超省時間&#xff01; 工具名稱&#xff1a;影刀RPA&#xff08;類似產品&#xff0c;八爪魚 RPA&#xff0c;操作上…

一種C# Winform的UI處理

效果 圓角 陰影 突出按鈕 說明 這是一種另類的處理&#xff0c;不是多層窗口 也不是WPF 。這種方式的特點是比較簡單&#xff0c;例如圓角、陰影、按鈕等特別容易修改過。其實就是html css DirectXForm。 在VS中如下 圓角和陰影 然后編輯這個窗體的Html模板&#xff0c…

HarmonyOS-ArkUI Navigation (導航組件)-第一部分

導航組件主要實現頁面間以及組件內部的界面跳轉&#xff0c;支持在不同的組件間進行參數的傳遞&#xff0c;提供靈活的跳轉棧操作&#xff0c;從而便捷的實現對不同頁面的訪問和復用。 我們之前學習過Tabs組件&#xff0c;這個組件里面也有支持跳轉的方式&#xff0c;Navigati…

華為開源自研AI框架昇思MindSpore應用案例:基于MindSpore框架實現PWCNet光流估計

如果你對MindSpore感興趣&#xff0c;可以關注昇思MindSpore社區 1 環境準備 1.進入ModelArts官網 云平臺幫助用戶快速創建和部署模型&#xff0c;管理全周期AI工作流&#xff0c;選擇下面的云平臺以開始使用昇思MindSpore&#xff0c;可以在昇思教程中進入ModelArts官網 創建…

虛幻基礎:UI

文章目錄 控件藍圖可以裝載其他控件藍圖可以安裝其他藍圖接口 填充&#xff1a;相對于父組件填充水平框尺寸—填充—0.5&#xff1a;改變填充的尺寸填充—0.5&#xff1a;改變與父組件的距離 錨點&#xff1a;相對于父組件的控件坐標系原點&#xff0c;屏幕比例改變時&#xff…

監控平臺——SkyWalking部署

一、環境準備 先下載SkyWalking安裝包&#xff0c;需要注意的是SkyWalking 版本在10.X以上使用的nacos-client是2.X&#xff0c;如果安裝的Nacos版本是1.X就會存在兼容性的問題。由于本人使用的SpringBoot項目是2.7.X版本&#xff0c;安裝的Nacos版本只能是1.X版本的&#xff…

熱門索尼S-Log3電影感氛圍旅拍LUTS調色預設 Christian Mate Grab - Sony S-Log3 Cinematic LUTs

熱門索尼S-Log3電影感氛圍旅拍LUTS調色預設 Christian Mate Grab – Sony S-Log3 Cinematic LUTs 我們最好的 Film Look S-Log3 LUT 的集合&#xff0c;適用于索尼無反光鏡相機。無論您是在戶外、室內、風景還是旅行電影中拍攝&#xff0c;這些 LUT 都經過優化&#xff0c;可為…

自動化工作流工具的綜合對比與推薦

最近收到很多朋友私信我說&#xff1a;“刷短視頻的時候&#xff0c;總是刷到自動化工作流的工具&#xff0c;有好多直播間都在宣傳&#xff0c;不知道哪款工具好”。我花了點時間&#xff0c;做了一下測試&#xff0c;大家可以參考一下&#xff0c;以下內容&#xff1a; 以下…

fircrawl本地部署

企業內部的網站作為知識庫給dify使用&#xff0c;使用fircrawl來爬蟲并且轉換為markdown。 ? git clone https://github.com/mendableai/firecrawl.gitcd ./firecrawl/apps/api/ cp .env.example .env cd ~/firecrawl docker compose up -d 官方&#xff1a; https://githu…

day17 學習筆記

文章目錄 前言一、數組的增刪改查1.resize函數2.append函數3.insert函數4.delete函數5.argwhere函數6.unique函數 二、統計函數1.amax&#xff0c;amin函數2.ptp函數3.median函數4.mean函數5.average函數6.var&#xff0c;std函數 前言 通過今天的學習&#xff0c;我掌握了num…

CentOS 8 Stream 配置在線yum源參考 —— 筑夢之路

CentOS 8 Stream ISO 文件下載地址&#xff1a;http://mirrors.aliyun.com/centos-vault/8-stream/isos/x86_64/CentOS-Stream-8-20240603.0-x86_64-dvd1.isoCentOS 8 Stream 網絡引導ISO 文件下載地址&#xff1a;http://mirrors.aliyun.com/centos-vault/8-stream/isos/x86_6…

網絡原理-TCP/IP

網絡原理學習筆記&#xff1a;TCP/IP 核心概念 本文是我在學習網絡原理時整理的筆記&#xff0c;主要涵蓋傳輸層、網絡層和數據鏈路層的核心協議和概念&#xff0c;特別是 TCP, UDP, IP, 和以太網。 一、傳輸層 (Transport Layer) 傳輸層負責提供端到端&#xff08;進程到進…

EF Core 執行原生SQL語句

文章目錄 前言一、執行查詢&#xff08;返回數據&#xff09;1&#xff09; 使用 FromSqlRaw或 FromSqlInterpolated 方法&#xff0c;適用于 DbSet<T>&#xff0c;返回實體集合。2&#xff09;結合 LINQ 查詢3&#xff09;執行任意原生SQL查詢語句&#xff08;使用ADO.N…

Unity LOD Group動態精度切換算法(基于視錐+運動速度)技術詳解

一、動態LOD技術背景與核心挑戰 1. 傳統LOD系統的局限 靜態閾值切換&#xff1a;僅基于距離的切換在動態場景中表現不佳 視覺突變&#xff1a;快速移動時LOD層級跳變明顯 性能浪費&#xff1a;靜態算法無法適應復雜場景變化 對惹&#xff0c;這里有一個游戲開發交流小組&…

MyBatis復雜查詢——一對一、一對多

目錄 &#xff08;一&#xff09;復雜查詢&#xff1a;1對1關系 【任務】數據庫里有學生表(student)和學生證信息表(student_card)&#xff0c;表結構如下所示&#xff0c;要求使用MyBatis框架查詢所有的學生信息以及每位學生的學生證信息 解決方案1&#xff1a;關聯查詢實現…

【服務端】使用conda虛擬環境部署Django項目

寫在開頭 為了與客戶端的Deep search配合&#xff0c;需要整一個后臺管理來保存和管理deep search的數據資料。選擇前端框架Vue-Vben-Admin Django后臺服務來實現這個項目。 廢話結束&#xff0c;從零開始。。。。 一、環境搭建 1. 安裝 Anaconda 下載 Anaconda&#xff1…

Python爬蟲-爬取大麥網演出詳情頁面數據

前言 本文是該專欄的第50篇,后面會持續分享python爬蟲干貨知識,記得關注。 本文,筆者以大麥網平臺為例。基于Python,實現獲取演出詳情頁面的演出信息。 廢話不多說,具體實現思路和詳細邏輯,筆者將在正文結合完整代碼進行詳細介紹。接下來,跟著筆者直接往下看正文詳細內…

多onnx模型導出合并調研(文本檢測+方向分類+文本識別)

??主頁:吾名招財 ??簡介:工科學碩,研究方向機器視覺,愛好較廣泛… ???簽名:面朝大海,春暖花開! 多onnx模型合并導出調研(文本檢測+方向分類+文本識別) 引言1,嘗試合并兩個模型(文本方向分類+文本識別模型)(并行合并)(1)文本方向分類(2)文本識別模型(…

Flink介紹——實時計算核心論文之S4論文詳解

引入 在上一篇我們對Flink的發展歷史有了全局的了解&#xff0c;下面我們會通讀幾篇分布式實時處理相關的重要論文&#xff0c;從S4到Storm&#xff0c;再從MillWheel到Dataflow&#xff0c;最后到Flink。 通過深入梳理分布式實時處理技術的發展脈絡&#xff0c;了解這些年技…