【JVM】JVM的內存結構是怎樣的?

JVM的內存結構是Java程序運行時內存管理的核心,不同區域有明確的職責。

一、整體劃分

包括兩大部分,分為線程私有區域(隨線程創建/銷毀,無需垃圾回收)和線程共享區域(所有線程共用,需要垃圾回收管理)。

  • 線程私有區域:程序計數器、虛擬機棧、本地方法棧。 支撐線程獨立執行(如方法調用、指令跟蹤)
  • 線程共享區域:堆、方法區(元空間)。 存儲對象實例、類信息等全局數據,是內存管理的核心區域

二、各區域詳解:

1.程序計數器(Program Counter Register):

  • 線程私有: 每個線程都有獨立的程序計數器,互不干擾。
  • 作用:記錄當當前線程 “下一條要執行的 JVM 字節碼指令的地址”,為線程提供執行路標,確保線程在切換(如CPU調度被中斷)后能夠恢復到正確的執行位置。

若執行的是 Java 方法,計數器存儲下一條要執行的字節碼指令的地址;
若執行的是 Native 方法(本地方法,如 C/C++ 實現),計數器值為undefined。 因為Native方法的執行由操作系統控制,而非JVM,無需JVM記錄指令地址。

特點:
1.內存空間極小,幾乎不占用資源。
2.是JVM中唯一不會發生OutOfMemoryError(OOM) 的區域
3.本質是線程執行的路標,確保線程切換(如CPU調度)后能恢復到正確執行的位置。

2.虛擬機棧:

  • 線程私有:每個線程創建時,會分配一個虛擬機棧生命周期與線程一致。
  • 作用:記錄方法調用的執行狀態,每個方法調用時,會創建一個棧幀,棧幀入棧;方法執行完畢,棧幀出棧。
  • 棧幀包含的內容:
    1.局部變量表: 存儲方法內的局部變量(如基本類型、對象引用),容量在編譯期確定;
    2.操作數棧:方法執行時的臨時數據存儲區(如計算a+b時,先將a和b入棧,再執行加法);
    3.動態鏈接:指向方法區中該方法的符號引用(運行時轉換為直接引用)
    4.返回地址:方法執行完后,回到調用者的位置(如main方法調用func(),func()執行完需回到main的下一行)。

可能的異常:
1.StackOverflowError:線程請求的棧深度超過虛擬機允許的最大深度(如遞歸調用無終止條件);
2.OutOfMemoryError:虛擬機棧可動態擴展時,擴展失敗(如創建過多線程,棧內存總需求超過系統內存)。

3.本地方法棧:

  • 線程私有:與虛擬機棧功能類似,但專門為 Native 方法(非 Java 實現的方法)服務。
  • 特點:
    可能拋出StackOverflowError(棧深度超限)和OutOfMemoryError(內存不足),與虛擬機棧一致。

4.堆:

  • 線程共享:JVM中內存占比最大的區域,幾乎所有對象實例(包括數組)都在這里分配內存。
  • 作用存儲對象實例,是**垃圾回收(GC)**的主要工作區域。
  • 結構劃分:
    堆空間通常按照對象“存活時間”劃分為以下區域:
    • 新生代:存放新創建的對象,分為:
      • Eden區(伊甸園):新對象優先分配到這里。
      • Survivor 區(幸存者區):分為 From 和 To 兩個大小相等的區域,用于存放 Eden 區回收后存活的對象(每次 GC 后,存活對象在 From 和 To 之間轉移,經過多次存活后進入老年代)。
    • 老年代:存放存活時間長的對象(如經過多次年輕代 GC 仍存活的對象)。

特點:
1.堆的大小可通過**-Xms(初始堆大小)和-Xmx(最大堆大小)參數配置(盡可能兩者設為一致,避免動態擴展消耗性能);
2.是
OOM 最常見的區域**(如創建對象過多且無法被 GC 回收,堆空間耗盡時拋出java.lang.OutOfMemoryError: Java heap space)。

5.方法區:

  • 線程共享:存儲已被 JVM 加載的類信息、常量、靜態變量、即時編譯器(JIT)編譯后的代碼等數據。
  • 歷史演進
    • JDK 7 及之前:方法區的實現稱為 “永久代(PermGen)”,屬于堆的一部分,大小固定(易 OOM);
    • JDK 8 及之后:永久代被元空間(Metaspace) 取代,元空間不再使用堆內存,而是直接使用本地內存(Native Memory),大小受系統內存限制(更靈活)。
  • 運行時常量池
    是方法區的一部分,存放編譯期生成的符號引用和字面量(如字符串常量"abc")。

三、各區域的協作關系:

Java 程序運行時,內存流轉大致如下:
1.類加載器將類信息加載到方法區(元空間)
2.主線程啟動,創建虛擬機棧,main方法的棧幀入棧;
3.執行new Object()時,在中創建對象實例,棧幀的局部變量表存儲該對象的引用(地址);
4.程序計數器記錄當前執行的字節碼指令地址,確保線程切換后能繼續執行;
5.方法執行完畢,棧幀出棧;對象不再被引用時,由 GC 在堆中回收。

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

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

相關文章

青少年軟件編程(python五級)等級考試試卷-客觀題(2023年12月)

更多內容和歷年真題請查看網站:【試卷中心 -----> 電子學會 ----> 機器人技術 ----> 五級】 網站鏈接 青少年軟件編程歷年真題模擬題實時更新 青少年軟件編程(python五級)等級考試試卷-客觀題(2023年12月&#xff0…

網絡編程-創建TCP協議服務器

int socket(int domain, int type, int protocol);頭文件&#xff1a; #include <sys/socket.h>#include <netinet/in.h> #include <netinet/ip.h>int skt_tcpfd;int domain;skt_tcpfdsocket(AF_INET,SOCK_STREAM,0);int bind(int sockfd, const struct soc…

ruoyi框架角色分配用戶

分配用戶&#xff0c;不要將當前正在登錄的用戶綁定。否則&#xff0c;在加入當前用戶之后&#xff0c;取消或者添加其他用戶時會被注銷當前登錄。

Java Stream常見函數與應用案例

1. Java Stream核心概念與基礎函數 1.1 Stream API的設計哲學與核心特性 Java Stream API的設計哲學源于函數式編程范式&#xff0c;其核心特性體現在數據處理模式的轉變上。與傳統集合操作相比&#xff0c;Stream API采用聲明式編程風格&#xff0c;支持鏈式調用&#xff0c;顯…

【Canvas與徽章】中國制造金色玻璃光徽章

【成圖】【代碼】<!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>中國制造金色玻璃光徽章 Draft1</title><style type"tex…

終結系統裸奔:Debian老舊版本安全加固終極指南

核心警示:Debian 8與10已結束官方支持,暴露于0day漏洞風險中。本文提供的加固方案僅為遷移前的臨時防護措施,非長久之計。 一、老舊Debian系統的致命隱患 支持狀態: Debian 8(Jessie):2018年終止安全更新 Debian 10(Buster):2024年7月結束主流支持 風險清單: 無補…

Ape.Volo項目源碼學習(1:源碼下載及運行)

Ape.Volo項目是基于 .Net 8 、SqlSugar、Vue2.x、RBAC、前后端分離開箱則用的中后臺快速開發框架&#xff0c;其使用Async/Await異步編程&#xff0c;支持CodeFirst模式、RabbitMQ/RedisMQ消息隊列、CORS 跨域配置、數據庫操作&#xff08;讀寫分離、多庫、分表&#xff09;、支…

2-4.Python 編碼基礎 - 流程控制(判斷語句、循環語句、break 語句與 continue 語句)

一、判斷語句 1、if 語句 &#xff08;1&#xff09;基本格式 if 【判斷條件】:【滿足條件時執行的代碼塊】&#xff08;2&#xff09;演示 number 10if number > 0:print("這個數是正數")# 輸出結果這個數是正數2、if - else 語句 &#xff08;1&#xff09;基本…

大模型自我進化框架SE-Agent:開啟軟件工程自動化新時代

一、引言&#xff1a;當大模型學會“自我進化” 在軟件開發領域&#xff0c;傳統模式下人類工程師面對復雜任務時&#xff0c;往往需要經歷反復調試、多輪迭代才能產出高質量代碼。而隨著大語言模型&#xff08;LLM&#xff09;的興起&#xff0c;一種名為**SE-Agent&#xff…

UE官方文檔學習 C++ TAarry 查詢(四)多種查詢方式

一.IndexofByKey 返回索引通過值&#xff0c;返回來查找鍵。二IndexOfByPredicate通過定義二元謂詞&#xff0c;來判定是否有符合謂詞判定的元素。符合條件True的&#xff0c;才返回Index。這里所謂Lamda,函數就是 把函數當作參數輸入&#xff0c;里面的參數值傳遞前加個[]。這…

根據Wireshark捕獲數據包時間和長度繪制電腦發射信號波形

下一期&#xff1a; 根據Wireshark捕獲數據包時間和長度繪制路由器發送給電腦數據的信號波形-CSDN博客 一、Wireshark采集數據 數據格式&#xff1a; 在我的另一篇博客中詳細介紹了怎么導出數據&#xff1a; Wireshark導出數據包時間和長度-CSDN博客 通過MATLAB加載數據&a…

Suno API 接入指南:快速上手與高效集成

隨著 AI 技術的發展&#xff0c;音樂生成已經逐漸成為開發者和創作者探索的新方向。Suno API 提供了一套簡潔的接口&#xff0c;讓我們能夠通過代碼快速生成音樂、歌詞&#xff0c;甚至旋律。本文將帶你從零開始&#xff0c;完成 Suno API 的接入與調用&#xff0c;并分享一些高…

React Hooks原理深潛:從「黑魔法」到「可觀測」的蛻變之旅

文章目錄【技術棧深潛計劃】React Hooks原理深潛&#xff1a;從「黑魔法」到「可觀測」的蛻變之旅一、引言&#xff1a;為什么我們需要“深潛”Hooks&#xff1f;二、基石&#xff1a;沒有JavaScript閉包&#xff0c;就沒有Hooks2.1 閉包的精簡回顧2.2 Hooks與閉包的關聯三、核…

MySql知識梳理之DDL語句

例子&#xff1a;為emp表增加一個新的字段”昵稱”為nickname&#xff0c;類型為varchar(20)alter table emp add nickname varchar(20) comment 昵稱;例子&#xff1a;將emp表的nickname字段修改為username&#xff0c;類型為varchar(30)ALTER TABLE emp CHANGE nickname us…

Games 101 第四講 Transformation Cont(視圖變換和投影變換)

三維變換 三種變換 下面分別是放縮&#xff0c;旋轉&#xff0c;平移在旋轉當中&#xff0c;繞著y軸旋轉矩陣的順序不一樣&#xff0c;因為繞著y軸轉在右手坐標系中 &#xff0c;z是第一軸&#xff0c;x是第二軸&#xff0c;而負號會加在第一軸上&#xff0c;因此負號在下面。 …

rust語言 (1.88) egui (0.32.1) 學習筆記(逐行注釋)(一)基本代碼

Cargo.toml [dependencies] eframe "0.32.1" egui "0.32.1"?啟動函數一&#xff1a;run_simple_native 簡化版入口函數&#xff0c;適用于快速原型開發僅需提供應用標題和 UI 渲染閉包即可運行典型使用場景&#xff1a;單面板工具、簡單演示程序 // 導入…

離線優先與沖突解決:ABP vNext + PWA 的邊緣同步

&#x1f6f0;? 離線優先與沖突解決&#xff1a;ABP vNext PWA 的邊緣同步 &#x1f4da; 目錄&#x1f6f0;? 離線優先與沖突解決&#xff1a;ABP vNext PWA 的邊緣同步0. 環境 &#x1f680;1. 場景與目標&#xff08;痛點→指標&#xff09;&#x1f3af;2. 架構與時序 …

Slither 審計自己寫的智能合約

作為區塊鏈開發者&#xff0c;寫完合約之后最重要的一步就是 檢查代碼有沒有漏洞。一旦部署到鏈上出了問題&#xff0c;不僅修復麻煩&#xff0c;還可能直接造成資金損失。 Slither 是一款非常好用的自動化審計工具&#xff0c;可以幫你快速找出大部分常見風險。這篇文章專門講…

Python萬里長征6(非教程)pandas篩選數據三基礎、三核心、三高級

文章目錄一、背景二、布爾索引2.1 總結三、進階核心用法&#xff08;實用高效&#xff09;3.1 多條件組合3.2 字符串表達式&#xff08;類似SQL&#xff09;3.3 針對字符串的正則匹配四、高級方法&#xff08;依賴基礎&#xff09;4.1 函數應用&#xff08;如apply()或lambda&a…

阿里云上部署nuxt開發的項目(SSG和SSR混合渲染)

1.項目說明及配置 // nuxt.config.ts export default defineNuxtConfig({// ... 其他配置// Nitro 引擎讓你可以非常精細地為每個頁面定義渲染策略nitro: {// 預設取決于你的部署平臺,例如 vercel, netlify, static 等,或者node-serverpreset: vercel, // 這里以 Vercel 為例…