java內存圖

java內存圖

  • java文件運行流程
  • 程序的內存空間
    • 認識虛擬機棧
      • 程序的執行流程
    • 認識堆
      • java的類與對象的關系

java文件運行流程

有這樣的一份 java 文件

在這里插入圖片描述

在該目錄下的終端運行 javac Hello.java 命令,會生成 Hello.class 文件,內容如下:

在這里插入圖片描述

Hello.java 打開是我們能夠看懂的代碼,也叫源代碼文件,源代碼文件是給咱們程序員去看的;而 Hello.class 文件這里邊是二進制的字節碼文件,二進制字節碼文件是給計算機看的

此時當前這兩份文件都在磁盤當中,都是在外部存儲設備當中

當終端運行 java Hello 這個命令,能將當前的二進制文件從磁盤放到內存中交給 CPU 運行,然后輸出 "hello world"

在這里插入圖片描述

由于 java 這個命令可以將當前的二進制文件從磁盤放到內存中交給 CPU 運行,那么該程序在內存空間中是什么樣的呢?接下來我們來討論程序的內存空間部分。

程序的內存空間

數據類型決定數據在內存當中是如何存儲的,正在運行的程序在內存當中都必須要有自己的內存空間,因為任何一個變量任何一個指針都需要內存空間來進行表達

數據在內存當中的存儲位置是由操作系統所決定的,程序的運行需要操作系統給它開辟內存空間,當擁有這塊內存空間后就由 java 程序自己去操作這一塊內存空間,該內存空間會被切分為以下幾個區域:

在這里插入圖片描述

其中最重要的三個是 虛擬機棧、堆 和 方法區
虛擬機棧 控制著程序的執行;
是用來存儲對象的;
方法區 用于存儲虛擬機加載的存儲類信息、常量、靜態變量、臨時數據等;
方法區中存儲的也就是當前的 .class 文件

下面我們來具體講解虛擬機棧和堆

認識虛擬機棧

我們來看這樣一份代碼文件:

在這里插入圖片描述
終端運行結果:

在這里插入圖片描述

下面我們來看程序的執行流程

程序的執行流程

程序的內存空間如下:

在這里插入圖片描述
其中虛擬機棧的執行流程如下:

在這里插入圖片描述

首先第一步 main 方法入棧,入棧后表達程序,對 “hello world” 做了輸出,之后它會調用 run() 方法入棧。run() 方法進行表達,執行是從上到下執行,第一步先定義一個局部變量 num = 100,num 本身是一個 int 類型的指針, num 是指向100的地址,假設它的地址是 0x10 那么 num 就指向0x10,輸出完了之后,調用 jump() 方法。jump() 方法里面也有一個局部變量 num,num 是從上邊賦過來的值,相當于是做了一次值傳遞,相當于是把這個100傳了過去,繼續執行輸出,jump() 也就執行完畢后出棧。那么又回到咱們當前這個 run() 方法了,run 方法此時執行完這一行之后也就會出棧了,這樣就又回到 main() 方法了。main 方法中 run() 執行完畢 run() 出棧,main() 接著會去執行下一個方法 aaa(),aaa()入棧,有一個局部變量 byte a = 10,輸出后 aaa 執行完 main 方法出棧,整個程序就執行完畢了。

程序的執行過程就是 main 方法從入站到出棧,程序執行第一步是main方法入棧最后一步一定是main方法出棧。程序從開始執行到執行完畢是由 main 方法來對其進行控制的,從上到下依次進行執行,整個流程就是程序的執行過程,程序的執行過程又被叫做 線程

引申:我們可以簡單去理解 java 當中的多線程,要想實現 java 當中的多線程就意味著我們需要多個程序的執行過程,而如何實現 java 當中的多線程,就需要多個虛擬機棧

認識堆

在講述堆之前我們先看 java 的類與對象的關系

java的類與對象的關系

有這樣一份代碼文件:

在這里插入圖片描述
我們發現打印結果里的 tom 和 jr 的名字不一樣

下面具體講解:

new :關鍵字(java保留字,有實際含義)在堆內存中開辟內存空間
Cat() :構造器,是在創建對象的時候給對象賦值
tom對象名或叫做變量名
Cat數據類型(引用數據類型中的類),數據類型決定數據在內存當中是如何存儲的
= :賦值操作,將對象的地址值賦給變量

程序執行第一步main方法入棧,之后它就會調用 Cat tom = new Cat();,首先 new 關鍵字會在堆里邊開辟一塊內存空間創建 tom 對象,由 Cat 數據類型決定數據在內存當中存儲形式,Cat 里邊有兩個方法和一個變量, eat(String food)、catchMouse() 和變量 name=‘aaa’,會將該對象的地址值 0x1 賦給 tom 變量。
每 new 一次都要開辟新的內存空間,Cat jr = new Cat(); 會在堆中開辟一塊內存空間創建 jr 對象,同樣地在該對象中有 eat(String food)、catchMouse() 和變量 name=‘aaa’,該對象的地址值 0x2 賦給 jr 變量。為什么此時 tom 和 jr 的是相同的,因為他們具有相同的數據類型 Cat,相同的數據類型的內存形式是一樣的。但是在 main 函數中 jr.name = "jr"; 對 jr 對象的 name 值進行了修改,這樣 jr 調用 name 輸出的就不再是 ‘aaa’ 了,而是 ‘jr’ 了。

在這里插入圖片描述

一個類可以創建出多個對象,tom 和 jr 是兩個不同的對象,但是它們的存儲形式是相同的,相同的數據類型內存形式是一樣的

類是創建對象的模板,那么模板里邊有什么那類里邊有什么,那對象當中就應該默認有什么

堆是用來存儲對象的

總結:類是創建對象的模板,一個類可以創建多個對象
什么是 java 對象:堆內存當中的存儲結構

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

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

相關文章

vscode編輯Markdown文件

一.安裝Markdown的插件 vscode的擴展,搜索Markdown Preview Enhanced的插件,并安裝。 其他的常用插件,還包括: Markdown All in One :提供了許多有用的功能,如快捷鍵支持、自動預覽、TOC(目錄&…

【PTA數據結構 | C語言版】查找樹中帶有指定數據的結點

本專欄持續輸出數據結構題目集,歡迎訂閱。 文章目錄題目代碼題目 請編寫程序,創建有 4 個結點的樹,然后查找給定的 x。 輸入格式: 輸入首先在第一行給出 4 個正整數,依次對應樹的根結點、根的第 1、2、3 個孩子結點的…

PostgreSQL常用命令與工具指南

文章目錄PostgreSQL常用命令與工具指南簡介1. 連接與基本操作連接數據庫環境變量設置(避免密碼輸入)常用元命令2. 數據庫與表管理數據庫操作創建數據庫刪除數據庫修改數據庫屬性表操作創建表修改表結構刪除表索引管理創建索引刪除索引3. 數據操作(CRUD)插…

SpringBoot項目部署至云服務器

目錄 一、后端項目部署 1、修改配置文件 2、清理打包緩存,打jar包(兩種方式二選一) 自動打包 手動打包 打包成功狀態 3、將jar包導入宿主機上 jar包位置 jar包上傳 jar包運行 瀏覽器測試 二、前端代碼 docker搭建nginx的基本步驟 打…

Agent-S:重新定義下一代 AI 智能體開發框架

Agent-S:重新定義下一代 AI 智能體開發框架 —— 探索 simular-ai 的開源革命 引言 2025 年,AI 智能體(Agent)技術正從概念走向產業核心。從自動化工作流到復雜決策系統,開發者亟需更高效的工具鏈。在這一背景下&am…

保持視頻二維碼不變,如何更新視頻內容,節省物料印刷成本

保持視頻二維碼不變,如何更新視頻內容,節省物料印刷成本? 視頻替換功能,是指在保持視頻二維碼不變、視頻觀看地址不變、視頻調用代碼不變的情況下替換視頻內容,從而節省用戶印刷物料的成本,滿足用戶更新視…

flutter項目調試問題小結

背景 目標是用android studio flutter 跑hello world 下載 android studio 我下載的是2024.3.2.15版本 最新版下載首頁就能下:下載 Android Studio 和應用工具 - Android 開發者 | Android Developers 歷史版本可在歸檔列表下載:Android Studio…

明細列表,明細grid中的默認按鈕失效,配置按鈕失效

明細列表,明細grid中的默認按鈕失效,配置按鈕失效原因:采用通配的寫法導致的默認按鈕失效if(menuDetails){menuDetails.forEach((item) > {const { name, menu_detail_columns, menu_detail_buttons, save_url} item;this.set(${name}Gri…

Matplotlib 30分鐘精通

?? Matplotlib 30分鐘精通計劃(完整版含輸出) ? 時間分配 5分鐘:Matplotlib基礎概念和簡單圖表 10分鐘:常用圖表類型詳解 10分鐘:圖表美化和定制 5分鐘:綜合實戰練習 ?? 第一部分:Matplotlib基礎概念 (5分鐘) 1. 什么是Matplotlib? import matplotlib.pyplot a…

7月19日 暴雨藍色預警:全國多地迎強降雨,需防范次生災害

中央氣象臺7月19日10時繼續發布暴雨藍色預警,預計未來24小時(19日14時至20日14時),我國多地將迎來大到暴雨,局地甚至出現大暴雨,并伴有短時強降水、雷暴大風等強對流天氣,需加強防范。 強降雨覆蓋范圍廣,多地需警惕極端降水 此次降雨影響范圍廣泛,涉及華北、華南、西…

Redis學習-05Redis基本數據結構

Redis 數據結構 String 字符串 基本命令表命令執行效果時間復雜度set key value [key value…]設置 key 的值是 valueO(k), k 是鍵個數get key獲取 key 的值O(1)del key [key …]刪除指定的 keyO(k), k 是鍵個數mset key value [key value …]批量設置指定的 key 和 valueO(k),…

開啟modbus tcp模擬調試

1、新建modbus tcp服務器 ?功能差異??客戶端功能?: 生成并發送Modbus請求報文(如功能碼03讀取寄存器)。?? 解析服務器響應數據,實現遠程監控或控制。?? ?服務器端功能?: 監聽默認端口(如502&…

昇思+香橙派 AI 開發實踐:DeepSeek 全流程指南(基于 openEuler)

一、 環境準備 1. 鏡像燒錄 鏡像燒錄可以在任何操作系統內執?,這?以在Windows系統為例,使用balenaEtcher?具,快速燒錄鏡像到Micro SD卡中。 本章節所需的軟/硬件如下: 軟件相關:balenaEtcher制卡?具、openEul…

AI生成郵件發送腳本(帶附件/HTML排版)與定時爬取網站→郵件通知(價格監控原型)

想象一下:每天早晨咖啡還沒喝完,你的郵箱就自動收到了心儀商品的最新價格;重要報告準時帶著專業排版的附件發送到客戶手中——這一切不需要你手動操作。本文將用不到100行代碼帶你實現這兩個自動化神器! 一、為什么我們需要自動化…

【vLLM 學習】Encoder Decoder Multimodal

vLLM 是一款專為大語言模型推理加速而設計的框架,實現了 KV 緩存內存幾乎零浪費,解決了內存管理瓶頸問題。 更多 vLLM 中文文檔及教程可訪問 →https://vllm.hyper.ai/ *在線運行 vLLM 入門教程:零基礎分步指南 源碼 examples/offline_inf…

【MySQL筆記】視圖

目錄一、什么是視圖?二、使用視圖的優勢三、視圖的創建與使用四、不能更新視圖的場景五、刪除視圖六、總結一、什么是視圖? 視圖(View)是一種虛擬表,不存儲實際數據,而是通過執行預定義的查詢動態生成數據…

【RK3576】【Android14】分區劃分

獲取更多相關的【RK3576】【Android14】驅動開發,可收藏系列博文,持續更新中: 【RK3576】Android 14 驅動開發實戰指南

Datawhale 25年7月組隊學習coze-ai-assistant Task1學習筆記:動手實踐第一個AI Agent—英倫生活口語陪練精靈

Chap1 了解AI工作流 1.1什么是工作流 工作流 就像是一條流水線,把復雜的任務拆分成多個簡單的步驟,每一步都有明確的目標和流程。1.2智能體和工作流的區別 智能體(AI Agent) **是什么 :**智能體是一個自動化的“助手”…

Webpack插件開發深度指南:從原理到實戰

Webpack插件是前端工程化的核心引擎,本文將帶你深入插件開發全流程,實現一個功能完整的資源清單插件,并揭示Tapable事件系統的核心原理。 一、Webpack插件機制解析 1.1 插件架構核心:Tapable事件系統 Webpack基于Tapable構建了…

2、Redis持久化詳解

Redis持久化詳解 文章目錄 Redis持久化詳解 前言 RDB和AOF的區別 RDB和AOF的優缺點 Redis 持久化配置 1、RDB持久化配置 2、AOF持久化配置(嘗試修復會刪除aof文件內容) 3、AOF 重寫功能 新增知識點: 新增知識點: 前言 Redis是一種高級 key-value 型的NoSQL數據庫。它跟mem…