JVM-內存結構

🧩 一、JVM內存五大核心結構詳解

📌 1. 程序計數器(Program Counter Register)
特性說明
作用記錄當前線程執行的字節碼行號指示器(分支/循環/異常處理的核心)
線程私有? 每個線程獨立存儲指令位置
異常? 唯一不會拋出OutOfMemoryError的區域
特殊場景?? 執行Native方法時值為undefined

📦 2. 虛擬機棧(Java Virtual Machine Stack)
// 棧幀內存模型示例
public void calculate() {int a = 1;                  // → 局部變量表(基本類型)Object obj = new Object();  // → 引用存棧,對象實例在堆obj.toString();             // → 動態鏈接指向方法區的方法字節碼
}

虛擬機棧是JVM執行Java方法的運行時數據結構,通過棧幀為每個方法調用提供隔離的執行環境,管理局部數據存儲和運算過程,構建完整的方法調用鏈

組件作用
局部變量表存儲基本類型(int/boolean等)和對象引用(reference指針)
操作數棧執行計算指令的臨時工作區(如加減乘除)
動態鏈接指向運行時常量池的方法符號引用(關聯方法區)
方法出口記錄方法返回地址(正常return或異常退出)
異常?? StackOverflowError(遞歸過深)
?? OOM(擴展棧內存失敗)

🌍 3. 本地方法棧(Native Method Stack)
特性說明
作用為JNI(Java Native Interface)方法提供內存空間(C/C++代碼)
線程私有? 與虛擬機棧隔離
異常?? 同虛擬機棧(StackOverflowError/OOM)
關鍵差異🔄 服務Native方法而非Java方法(但HotSpot將兩棧合并)

🗃? 4. 堆(Heap)
JVM堆內存
年輕代
老年代
Eden區
Survivor區
S0區
S1區

內存比例

  • -XX:NewRatio=2:老年代:年輕代=2:1(默認)
  • -XX:SurvivorRatio=8:Eden:S0:S1=8:1:1

對象晉升規則

年齡1
年齡2
年齡3
年齡>15
年齡>15
大對象
對象創建
Eden區
S0區
S1區
老年代
特性說明
線程共享? 所有線程訪問同一堆空間
存儲內容對象實例、數組、字符串常量池(JDK7+)
GC機制分代回收:
- 新生代(Minor GC)
- 老年代(Full GC)
異常?? OutOfMemoryError(內存泄露/大對象)
配置參數-Xms(初始堆大小)
-Xmx(最大堆大小)

📚 5. 方法區(Method Area)
版本實現名稱存儲位置內容參數配置
JDK7-永久代JVM內存類元數據/運行時常量池/靜態變量-XX:PermSize
JDK8+元空間本地內存類元數據/運行時常量池-XX:MaxMetaspaceSize
共性JIT編譯代碼/方法字節碼

💡 重大變革
靜態變量在JDK7后存入堆中!字符串常量池在JDK7從永久代移至堆。


🔤 二、常量池體系解析

常量池分為三級結構,關系如下:

類加載
字符串解析
Class文件常量池
運行時常量池
字符串常量池
1. Class 文件常量池 (Constant Pool)
  • 位置.class文件中的固定結構
  • 內容
    ? 字面量:字符串、數值等顯式常量
    String s = "fly";  // "fly" 即字面量
    
    ? 符號引用
    → 類/接口的全限定名(如java/lang/Object
    → 字段名和描述符(如Ljava/lang/String;
    → 方法名和描述符(如()V
  • 特點
    → 編譯期生成
    靜態存儲(不依賴運行時)
2. 運行時常量池 (Runtime Constant Pool)
  • 位置:方法區的一部分(JDK8+在元空間)
  • 生成過程
    → 類加載時,將Class文件常量池加載到內存
    符號引用 → 解析為 直接引用(指向方法/字段的內存地址)
  • 動態性
    ? 支持運行時添加常量(如String.intern()
    ? 存儲內容:
    → 類/方法解析后的直接引用
    → 數值/字符串等基本常量
3. 字符串常量池 (String Table)
  • 位置演變

    JDK版本位置原因
    JDK6方法區受永久代大小限制,易OOM
    JDK7+堆內存允許GC回收,避免OOM;調優更靈活
  • 核心機制

    // 示例1:直接賦值(優先使用常量池)
    String s1 = "fly";                // 在常量池創建對象
    String s2 = "fly";                // 復用常量池對象(s1 == s2)// 示例2:new創建(堆中新對象)
    String s3 = new String("fly");    // 堆中創建新對象(s1 ≠ s3)// 示例3:intern主動入池
    String s4 = s3.intern();          // 返回常量池引用(s1 == s4)
    
  • 設計優勢
    ? 避免重復創建:相同字符串共享內存
    ? GC可回收:JDK7+后可被垃圾回收


常量池對比總結

特性Class文件常量池運行時常量池字符串常量池
存在階段編譯期(.class文件)運行期(方法區/元空間)運行期(堆)
是否可動態添加??(intern等)?(intern強制入池)
內容字面量+符號引用直接引用+運行時添加的常量唯一字符串的引用
內存回收不支持JDK8+由元空間管理JDK7+支持GC回收
OOM風險元空間溢出堆內存溢出

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

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

相關文章

從 Revit 到 3DTiles:GISBox RVT 切片器如何讓建筑圖元在 Web 端展示

在GIS(地理信息系統)行業蓬勃發展的當下,數據處理與展示的效率和精準度成為關鍵。GISBox作為一款功能強大的一站式三維GIS數據編輯、轉換、發布平臺,憑借其獨特的“RVT切片器”功能,在RVT圖元處理方面也有著不俗的表現…

【Linux】為 Git 設置 Commit 提交模板方法,可統一個人或者項目的提交風格

為 Git 設置 Commit 提交模板 新建模板文件。注意之后不能刪除該文件。 gedit ~/.gitmessage.txt粘貼自己的模板。可以給 AI 提自己的需求&#xff0c;定制一個模板&#xff0c;例如 # <type>(<scope>): <description> # # [optional body] # # [optional…

Android第十二次面試GetX庫渲染機制

核心引擎&#xff1a;GetX / Obx 的魔法 .obs 是數據響應式化的關鍵操作&#xff0c;它將普通變量轉換為可觀察(Observable)對象&#xff1a; // 傳統變量 - 無法自動通知更新 int count 0; // 響應式變量 - 自動通知能力 var count 0.obs; // RxInt(0) Obx 是 UI ?響應式…

用 Whisper 打破沉默:AI 語音技術如何重塑無障礙溝通方式?

網羅開發 &#xff08;小紅書、快手、視頻號同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企業從事人工智能項目研發管理工作&#xff0c;平時熱衷于分享各種編程領域的軟硬技能知識以及前沿技術&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…

ubuntu 添加應用到啟動菜單

使用Alacarte菜單編輯器 Alacarte是一個簡單易用的菜單編輯器&#xff0c;可以幫助用戶添加、刪除或編輯應用程序的啟動菜單項。 安裝Alacarte sudo apt-get install alacarte 執行alacarte alacarte 使用說明 選擇新建項目進行添加 "Name"欄填自定義的名稱&quo…

【學習筆記】構造函數+重載相關

【學習筆記】構造函數重載相關 一、構造函數 構造函數在創建對象的過程就會執行&#xff0c;帶參數與不帶參數&#xff0c;帶參數的構造函數會默認將成員變量賦值傳進去的參數。 class Layer { private:int layer_id; // 層IDstd::string layer_json; // 層的JSON配置…

6.6 計算機網絡面試題

描述一下打開百度首頁后發生的網絡過程 網頁非常慢轉圈圈的時候&#xff0c;要定位問題需要從哪些角度&#xff1f; server a和server b&#xff0c;如何判斷兩個服務器正常連接&#xff1f;出錯怎么辦&#xff1f; 服務端正常啟動了&#xff0c;但是客戶端請求不到有哪些原因?…

Java -jar命令運行外部依賴JAR包的深度場景分析與實踐指南

Java -jar命令運行外部依賴JAR包的深度場景分析與實踐指南 引言&#xff1a;外部依賴JAR的必要性 在Java應用部署中&#xff0c;java -jar命令是啟動可執行JAR包的標準方式。但當應用需要依賴外部JAR文件時&#xff08;如插件系統、模塊化部署、共享庫等場景&#xff09;&…

XHR / Fetch / Axios 請求的取消請求與請求重試

XHR / Fetch / Axios 請求的取消請求與請求重試是前端性能優化與穩定性處理的重點&#xff0c;也是面試高頻內容。下面是這三種方式的詳解封裝方案&#xff08;可直接復用&#xff09;。 ? 一、Axios 取消請求與請求重試封裝 1. 安裝依賴&#xff08;可選&#xff0c;用于擴展…

2025最新Java日志框架深度解析:Log4j 2 vs Logback性能實測+企業級實戰案例

一、為什么printStackTrace是"代碼墳場"&#xff1f; 你寫的日志可能正在拖垮系統&#xff01; 在Java開發中&#xff0c;直接調用printStackTrace()打印異常堆棧是最常見的"自殺式操作"。這種方式會導致三大致命問題&#xff1a; 無法分級控制&#xff…

前端面試四之Fetch API同步和異步

Fetch API&#xff08;Fetch Application Programming Interface&#xff09;是一個現代的、基于Promise的網絡請求接口&#xff0c;用于在瀏覽器環境中發起網絡請求并處理響應。它是對傳統XMLHttpRequest的改進&#xff0c;提供了更簡潔、靈活和強大的功能&#xff0c;廣泛應用…

ubuntu 20.04掛載固態硬盤

我們有個工控機&#xff0c;其操作系統是ubuntu 20.04。可以接入一個固態硬盤。將固態硬盤插好后&#xff0c;就要進行掛載。在AI的指導下&#xff0c;過程并不順利。記錄如下&#xff1a; 1、檢查硬盤是否被識別 安裝好硬盤后&#xff0c;運行以下命令來檢查Linux系統是否…

涂裝協作機器人:重新定義涂裝工藝的智能化未來

一、涂裝場景的產業變革與核心訴求 1.1 千億級市場的技術突圍戰 在汽車制造領域&#xff0c;涂裝車間被稱為"工業化妝間"&#xff0c;其工藝質量直接影響產品溢價能力。當前行業面臨三重挑戰&#xff1a; 質量維度&#xff1a;傳統人工噴涂存在膜厚波動15μm的行業…

Unity優化篇之DrawCall

當然可以&#xff01;以下是完整、詳盡、可發布的博客文章&#xff0c;專注講解 Unity 的靜態合批與動態合批機制&#xff0c;并詳細列出它們對 Shader 的要求和所有限制條件。文章結構清晰、技術深度足夠&#xff0c;適合發布在 CSDN、掘金、知乎等技術平臺。 urp默認隱藏動態…

Electron桌面應用下,在拍照、展示pdf等模塊時,容易導致應用白屏

Electron 應用白屏問題分析與解決方案 Electron 應用中拍照、PDF展示等模塊導致白屏的常見原因通常與內存泄漏、渲染進程崩潰或資源加載超時有關。以下是具體排查與解決方法&#xff1a; 檢查內存泄漏 項目中&#xff0c;分析代碼&#xff0c;高頻操作或未釋放的資源可能導致…

比對++Hex or Bin文件

用NotePad 安裝 ?? Hex-Editor 插件 1.1參考方法路徑https://cloud.tencent.com/developer/article/2311013 1.2 下載 Hex-Editor.dll文件路勁 https://sourceforge.net/projects/npp-plugins/ 比對 2.1, 顯示Bin 插件/Hex Editor/View in Hex 2.2 插件/Compare(運行很不流…

以STM32H7微控制器為例,簡要說明stm32h7xx_it.c的作用

在STM32開發中&#xff0c;stm32h7xx_it.c文件是中斷服務例程&#xff08;ISR, Interrupt Service Routine&#xff09;的核心實現文件&#xff0c;其作用與產生的邏輯如下&#xff1a; 一、文件的核心作用 中斷處理入口 該文件定義了STM32H7微控制器所有硬件中斷和異常的處理函…

若依框架頁面緩存查詢條件后,切換頁面想重新請求一下數據

因為框架使用了Keep-Alive緩存組件&#xff0c;所以使用onActivated鉤子 import { onActivated } from vue;// 當組件從緩存中重新激活時 onActivated(() > {getList(); });

智能心理醫療助手開發實踐:從技術架構到人文關懷——CangjieMagic情感醫療應用技術實踐

作為一名長期耕耘在醫療健康領域的技術開發者&#xff0c;我至今仍清晰地記得三年前那個深夜——當我調試的心理健康AI第一次對用戶的情緒崩潰做出恰當回應時&#xff0c;整個團隊爆發的歡呼聲。那一刻&#xff0c;我深刻意識到技術不只是冰冷的邏輯&#xff0c;更可以成為溫暖…

漢諾塔問題深度解析

漢諾塔問題深度解析 一、漢諾塔問題的起源與背景1.1 問題起源1.2 歷史發展 二、漢諾塔問題的描述與規則2.1 問題描述2.2 示例說明 三、漢諾塔問題的遞歸求解原理3.1 遞歸思想概述3.2 漢諾塔問題的遞歸分解3.3 遞歸調用棧分析 四、漢諾塔問題的多語言實現4.1 Python實現4.2 C實現…