jvm的棧和堆

在 JVM 中,棧(Stack)和堆(Heap)是兩種核心內存區域,用于存儲不同類型的數據,它們的設計和存儲規則有明確區分,主要體現在存儲內容、生命周期和管理方式上:

一、棧(Stack,線程私有)

棧是線程獨占的內存區域,每個線程創建時都會分配一個棧,用于存儲線程執行過程中的局部變量、方法調用信息等,遵循 “先進后出”(FILO)的原則。

存儲內容:

  1. 局部變量:方法內定義的基本數據類型(intcharboolean?等)和對象引用(指向堆中對象的地址,而非對象本身)。
    例如:int a = 10; String s = new String("abc");?中,a?的值(10)和?s?的引用(地址)存儲在棧中,而?"abc"?對象本身在堆中。

  2. 方法調用信息(棧幀):每個方法被調用時,JVM 會在棧中創建一個 “棧幀”,包含:

    • 方法的參數
    • 局部變量表
    • 操作數棧(臨時計算空間)
    • 方法返回地址(調用該方法的位置)

方法執行完畢后,棧幀會被自動彈出并釋放內存,無需 GC 參與。

特點:

  • 生命周期與線程綁定:線程結束,棧內存自動釋放。
  • 大小固定:棧的內存空間在 JVM 啟動時可通過參數(-Xss)設置,超出會拋出?StackOverflowError(如遞歸調用過深)。
  • 訪問速度快:棧是連續的內存空間,由 JVM 直接管理,讀寫效率高于堆。

二、堆(Heap,線程共享)

堆是 JVM 中最大的內存區域,被所有線程共享,用于存儲對象實例和數組,是垃圾回收(GC)的主要區域。

存儲內容:

  1. 對象實例:通過?new?關鍵字創建的對象(包括所有成員變量,無論基本類型還是引用類型)。
    例如:User user = new User();?中,User?類的實例(包含其成員變量,如?nameage)存儲在堆中,user?是指向該對象的引用(存在棧中)。

  2. 數組:所有數組(無論基本類型數組還是對象數組)的元素都存儲在堆中。
    例如:int[] arr = new int[10];?中,數組的 10 個?int?元素存儲在堆中,arr?是引用(存在棧中)。

特點:

  • 動態分配內存:堆的大小可動態調整(通過?-Xms?初始大小、-Xmx?最大大小設置),沒有固定的生命周期。
  • 垃圾回收管理:堆中對象不再被引用時,不會立即釋放內存,而是等待 GC 定期回收,這也是 Java 自動內存管理的核心。
  • 內存碎片化可能:由于對象頻繁創建和回收,堆可能產生內存碎片(通過 GC 算法優化,如標記 - 整理可減少碎片)。

三、核心區別總結

維度棧(Stack)堆(Heap)
所有者線程私有(每個線程一個棧)所有線程共享
存儲內容局部變量、方法棧幀、對象引用對象實例、數組
生命周期隨方法調用 / 線程結束而創建 / 銷毀隨對象是否被引用動態變化(由 GC 管理)
內存管理自動彈出棧幀,無需 GC依賴 GC 回收無引用對象
訪問速度快(連續內存,直接操作)較慢(需通過引用定位,可能有碎片)
異常類型棧溢出(StackOverflowError內存溢出(OutOfMemoryError

一句話概括

棧存局部變量和方法調用信息,隨線程 / 方法生命周期自動管理;堆存對象實例和數組,由 GC 動態回收。這種分離設計既保證了局部數據的高效訪問,又實現了對象內存的靈活管理,是 JVM 內存模型的核心基礎。

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

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

相關文章

自動駕駛車輛的敏捷安全檔案

簡介近年來,在開發安全關鍵軟件時,敏捷開發方法的使用日益增多。敏捷方法非常適合自動駕駛汽車軟件的增量改進、運行設計域的逐步擴展以及新型智能路側單元的開發。由于車輛和智能路側單元的預期改進,未來幾年將會有新的自動駕駛車輛試驗。因…

【時時三省】(C語言基礎)動態內存分配與它的指針變量

山不在高,有仙則名。水不在深,有龍則靈。 ----CSDN 時時三省什么是內存的動態分配全局變量是分配在內存中的靜態存儲區的,非靜態的局部變量(包括形參)是分配在內存中的動態存儲區的,這個存儲區是一個稱為棧…

SpringMVC的核心架構與請求處理流程

Spring MVC 核心架構核心組件組件作用類比DispatcherServlet前端控制器,統一接收請求并協調各組件處理一個餐廳的前臺HandlerMapping根據請求URL映射到對應的處理器(Controller)路由表HandlerAdapter執行處理器方法,處理參數綁定、…

css 不錯的按鈕動畫

效果圖wxml <view class"{{status?active:}}"><view class"up-top btn"><text>向上</text></view><view class"up-left btn"><text>向左</text></view><view class"up-center b…

若依框架RuoYi-Vue-Plus-5.X的啟動,本地安裝docker,再部署 Redis、PG數據庫(智慧水務)SmartWaterServer

一、部署redis數據庫拉取鏡像 docker pull redis啟動Redis容器docker run -d --name redis-server -p 6379:6379 -v redis-data:/data redis redis-server --requirepass 123redis版本二、部署PostgreSQL 數據庫拉取鏡像docker pull postgres:15 創建數據存儲目錄、建議將數據掛…

Idea 清除無用的引用類

在IntelliJ IDEA中&#xff0c;你可以通過以下方式將選中的代碼設置為大寫&#xff1a;1. 使用快捷鍵(推薦)Windows/Linux&#xff1a;Ctrl Shift UMac&#xff1a;Cmd Shift U操作步驟&#xff1a;選中文本按下快捷鍵&#xff0c;即可在大小寫之間切換。2. 通過菜單操作選…

同個主機拉取不同權限倉庫的方法

背景&#xff1a;因為某些神奇的原因&#xff0c;無法同時授權倉庫權限給自己。 1.本地電腦只有權限訪問web倉庫地址&#xff0c;無權限訪問backend倉庫&#xff1b; 2.堡壘機服務器只有權限訪問backend倉庫&#xff0c;無權限訪問web倉庫地址。 web倉庫地址 &#xff1a;codeu…

快速搭建Node.js服務指南

Node.js是構建高效、可擴展網絡應用的理想選擇。以下是幾種快速搭建Node.js服務的方法。 方法一&#xff1a;使用Express&#xff08;最流行框架&#xff09; 1. 初始化項目 mkdir my-node-service cd my-node-service npm init -y2. 安裝Express npm install express3. 基礎服…

通義千問Qwen3-30B-A3B-Thinking-2507技術解析:推理模型的工程實踐突破

Qwen3-30B-A3B模型架構圖2025年7月30日&#xff0c;阿里云通義千問團隊發布了Qwen3-30B-A3B-Thinking-2507推理模型&#xff0c;這是繼Qwen3-30B-A3B-Instruct-2507后的又一力作。作為專注于推理任務的專用模型&#xff0c;它在數學能力測試AIME25上取得85.0分&#xff0c;超越…

【源力覺醒 創作者計劃】文心一言與deepseek集成springboot開發哪個更方便

一.實驗背景 當前文心一言和deepseek都開源了&#xff0c;二者都可以作為大模型應用開發的模型基礎了&#xff0c;我們都可以編寫springboot項目來集成deepseek和文心一言了 二.實驗目標 本文基于實際操作&#xff0c;通過實際操作來對比文心一言和deepseek在集成到springbo…

核磁共振數據T2幾何均值計算

1、T? 幾何均值公式如下&#xff1a;2、核磁T2幾何均值計算代碼 CSV 文件文件格式&#xff1a; 每一行是一個樣點&#xff08;樣品深度&#xff09;&#xff0c;列為&#xff1a;第一列是“深度”或其他&#xff1b;第二列及以后&#xff08;如 TASPEC0 ~ TASPEC199&#xff0…

微服務架構技巧篇——接口類設計技巧

目錄 一、微服務架構的特點 二、微服務接口類設計技巧 2.1、BFF(Backend For Frontend) 2.1.1、 服務分布式帶來的第一個挑戰導致的幾個典型問題 2.1.2、什么是 BFF 2.1.3、BFF 應用場景 2.1.4、BFF 落地經驗 2.1.4.1、前端負責 BFF 開發優缺點 2.1.4.2、后端負責 BFF 開發優…

C++游戲開發(2)

直接上代碼 1.首先是頭文件編寫 #include <iostream> #include <graphics.h> #include <string> 2,添加畫布 長1280&#xff0c;寬720 initgraph(1280, 720); 3.添加主循環 bool running true; while(runing) { } 4.定義結構體變量msg ExMessge msg; 5.開…

Unity開發2D類銀河惡魔城游戲學習筆記目錄

Unity開發2D類銀河惡魔城游戲學習筆記 Unity教程&#xff08;零&#xff09;Unity和VS的使用相關內容 玩家狀態機 Unity教程&#xff08;一&#xff09;開始學習狀態機 Unity教程&#xff08;二&#xff09;角色移動的實現 Unity教程&#xff08;三&#xff09;角色跳躍的實現…

智慧社區項目開發(三)——基于 Spring Boot 實現動態路由加載:從數據庫到前端菜單的完整方案

在后臺管理系統中&#xff0c;不同用戶角色往往擁有不同的操作權限&#xff0c;對應的菜單展示也需動態調整。動態路由加載正是解決這一問題的核心方案 —— 根據登錄用戶的權限&#xff0c;從數據庫查詢其可訪問的菜單&#xff0c;封裝成前端所需的路由結構并返回。本文將詳細…

Python在自動化與運維領域的核心角色:工具化、平臺化與智能化

&#x1f4dd;個人主頁&#x1f339;&#xff1a;慌ZHANG-CSDN博客 &#x1f339;&#x1f339;期待您的關注 &#x1f339;&#x1f339; 引言 在 IT 系統日益復雜、運維任務持續增長的今天&#xff0c;自動化已成為企業基礎設施管理的關鍵方向。Python 以其簡潔的語法、強大…

RAG實戰指南 Day 28:RAG系統緩存與性能優化

【RAG實戰指南 Day 28】RAG系統緩存與性能優化 開篇 歡迎來到"RAG實戰指南"系列的第28天&#xff01;今天我們將深入探討RAG系統的緩存機制與性能優化策略。在實際生產環境中&#xff0c;RAG系統往往面臨高并發、低延遲的需求&#xff0c;而合理的緩存設計和性能優…

swanlab實驗優雅起名

init中的參數的作用project&#xff1a;整個實驗的名字&#xff1b;experiment_name&#xff1a;在這個實驗中&#xff0c;你的名字是什么&#xff1b; 比如說現在我們要進行對比實驗&#xff0c;PEAN和Triflownet分別是對比方法的名字&#xff0c;這樣的好處是&#xff0c;她們…

Nestjs框架: NestJS 核心機制解析 —— DI(依賴注入)容器與模塊化工作原理

理解 NestJS 的 DI 管理機制 我們想要了解依賴注入&#xff08;Dependency Injection, DI&#xff09;最核心的工作邏輯NestJS 擁有自己的一套 DI 管理系統&#xff0c;它通過一個稱為 DI 容器 的機制&#xff0c;來統一管理應用中所有類&#xff08;class&#xff09;的依賴關…

日語學習-日語知識點小記-構建基礎-JLPT-N3階段(12):文法+單詞

日語學習-日語知識點小記-構建基礎-JLPT-N3階段&#xff08;12&#xff09;&#xff1a;文法單詞 1、前言&#xff08;1&#xff09;情況說明&#xff08;2&#xff09;工程師的信仰2、知識點&#xff11;ーたぶん 多分&#xff12;ーV&#xff08;て&#xff09;いく ? V&…