JVM 每個區域分別存儲什么數據?

JVM(Java Virtual Machine)的運行時數據區(Runtime Data Areas)被劃分為幾個不同的區域,每個區域都有其特定的用途和存儲的數據類型。以下是 JVM 各個區域存儲數據的詳細說明:

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

  • 存儲內容:

    • 當前線程正在執行的 Java 方法的 字節碼指令的地址(行號)。
    • 如果當前線程正在執行的是 Native 方法,程序計數器的值為 undefined (空)。
  • 特點:

    • 線程私有:每個線程都有自己獨立的程序計數器。
    • 非常小:占用內存空間非常小。
    • 唯一:是唯一一個在 Java 虛擬機規范中沒有規定任何 OutOfMemoryError 情況的區域。
  • 作用:

    • 控制程序的執行流程:JVM 通過程序計數器來控制程序的執行順序,實現分支、循環、跳轉、異常處理、線程恢復等功能。
    • 線程切換:Java 虛擬機的多線程是通過線程輪流切換、分配處理器執行時間來實現的。在任何一個確定的時刻,一個處理器(或一個內核)只會執行一條線程中的指令。為了線程切換后能恢復到正確的執行位置,每條線程都需要有一個獨立的程序計數器。

2. 虛擬機棧 (VM Stack)

  • 存儲內容:

    • 棧幀 (Stack Frame): 每個方法調用都會創建一個棧幀,用于存儲方法的局部變量、操作數棧、動態鏈接、方法出口等信息。方法執行完畢后,棧幀會被銷毀(出棧)。
      • 局部變量表 (Local Variable Table):
        • 存放方法參數和方法內部定義的局部變量。
        • 基本數據類型變量:直接存儲值。
        • 引用類型變量:存儲對象的引用(地址)。
        • 局部變量表的大小在編譯時確定。
      • 操作數棧 (Operand Stack):
        • 一個后入先出 (LIFO) 棧,用于存放方法執行過程中的操作數和中間結果。
        • 例如,執行加法操作時,會將兩個操作數壓入操作數棧,然后彈出兩個操作數進行計算,并將結果壓入操作數棧。
      • 動態鏈接 (Dynamic Linking):
        • 指向運行時常量池中該棧幀所屬方法的引用。
        • 用于支持方法調用過程中的動態鏈接(例如,解析方法調用、接口調用等)。
      • 方法出口 (Return Address):
        • 記錄方法返回時應該跳轉到的指令地址。
        • 正常返回:返回到調用者的指令地址。
        • 異常返回:返回到異常處理器的指令地址。
      • 附加信息: 可能包含一些附加信息, 例如調試信息等.
  • 特點:

    • 線程私有:每個線程都有自己的虛擬機棧。
    • 后入先出 (LIFO):棧幀的創建和銷毀遵循后入先出的原則。
    • 速度快:訪問速度僅次于程序計數器。
    • 大小:棧的大小可以是固定的,也可以是動態擴展的。
  • 異常:

    • StackOverflowError: 如果線程請求的棧深度大于虛擬機允許的深度,拋出此異常(例如,無限遞歸調用)。
    • OutOfMemoryError: 如果虛擬機棧可以動態擴展,但無法申請到足夠的內存,拋出此異常。

3. 本地方法棧 (Native Method Stack)

  • 存儲內容:
    • 與虛擬機棧類似,但用于支持 native 方法(使用 C、C++ 等編寫的方法)的執行。
    • 存儲 native 方法的局部變量、參數、返回值等信息。
  • 特點:
    • 線程私有:每個線程都有自己的本地方法棧。
    • 具體的實現方式由虛擬機決定(HotSpot VM 中,本地方法棧和虛擬機棧是合二為一的)。
  • 異常:
    • StackOverflowError
    • OutOfMemoryError

4. 堆 (Heap)

  • 存儲內容:

    • 對象實例: 幾乎所有的對象實例都在堆上分配內存。
    • 數組: 數組也在堆上分配內存。
  • 特點:

    • 線程共享:所有線程共享同一個堆。
    • 最大:是 JVM 中最大的一塊內存區域。
    • 垃圾回收:是垃圾回收的主要區域。
    • 邏輯連續:邏輯上是連續的,物理上可以不連續。
    • 劃分:通常劃分為新生代(Young Generation)和老年代(Old Generation)。
      • 新生代:存放新創建的對象。
        • Eden 區:大多數對象首先在 Eden 區分配。
        • Survivor 區 (From Survivor 和 To Survivor):存放經過一次 Minor GC 后仍然存活的對象。
      • 老年代:存放生命周期較長的對象,或大對象。
  • 異常:

    • OutOfMemoryError: 如果堆中沒有足夠的內存分配給新的對象,并且堆也無法再擴展時,拋出此異常。

5. 方法區 (Method Area)

  • 存儲內容:

    • 類信息:
      • 類的全限定名
      • 類的父類
      • 類的接口
      • 類的修飾符
      • 類的字段信息
      • 類的方法信息
      • 類的注解信息
    • 常量:
      • 編譯時常量(例如,final 修飾的基本類型或字符串字面量)。
      • 運行時常量(例如,String.intern() 方法返回的字符串)。
    • 靜態變量:
      • 類變量(static 修飾的變量)。
    • 即時編譯器編譯后的代碼 (JIT Compiled Code):
      • 熱點代碼(經常執行的代碼)會被 JIT 編譯器編譯為本地機器碼,并緩存在方法區中。
  • 特點:

    • 線程共享:所有線程共享同一個方法區。
    • 非堆 (Non-Heap): 在 HotSpot VM 中,方法區也被稱為“非堆”。
    • 永久代/元空間:
      • JDK 1.7 及之前: HotSpot VM 使用“永久代”(Permanent Generation)來實現方法區。永久代使用 JVM 內存。容易出現 OutOfMemoryError: PermGen space
      • JDK 1.8 及之后: HotSpot VM 使用“元空間”(Metaspace)來實現方法區。元空間使用本地內存(Native Memory),不容易出現 OutOfMemoryError,但需要注意防止本地內存耗盡。
    • 運行時常量池 (Runtime Constant Pool): 方法區的一部分,存放編譯期生成的各種字面量和符號引用,以及運行時產生的常量。
    • 垃圾回收: 方法區也會進行垃圾回收,主要回收廢棄的常量和無用的類。
  • 異常:

    • OutOfMemoryError: 如果方法區無法滿足內存分配需求,拋出此異常。
    • JDK 1.7 及之前,如果永久代空間不足,會拋出 OutOfMemoryError: PermGen space
    • JDK 1.8 及之后,如果元空間不足,會拋出 OutOfMemoryError: Metaspace

總結:

區域存儲內容線程共享性
程序計數器當前線程正在執行的字節碼指令的地址(行號)。如果是 Native 方法,則值為空 (Undefined)。私有
虛擬機棧每個方法調用對應一個棧幀。棧幀中存儲局部變量表、操作數棧、動態鏈接、方法出口等信息。局部變量表存放方法參數和局部變量。操作數棧用于存放方法執行過程中的操作數和中間結果。私有
本地方法棧與虛擬機棧類似,但用于支持 native 方法的執行。私有
對象實例、數組。共享
方法區類信息(類名、父類、接口、字段、方法、注解等)、常量、靜態變量、即時編譯器編譯后的代碼。運行時常量池是方法區的一部分,存放編譯期生成的各種字面量和符號引用,以及運行時產生的常量。共享

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

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

相關文章

C++中shared_ptr 是線程安全的嗎?

在 C 中,shared_ptr 的線程安全性和實現原理可以通過以下方式通俗理解: 1. shared_ptr 是線程安全的嗎? 答案:部分安全,需分場景! 安全的操作: 引用計數的增減:多個線程同時復制或銷…

什么是 CSSD?

文章目錄 一、什么是 CSSD?CSSD 的職責 二、CSSD 是如何工作的?三、CSSD 為什么會重啟節點?情況一:網絡和存儲都斷聯(失聯)情況二:收到其他節點對自己的踢出通知(外部 fencing&#…

arm64平臺下linux訪問寄存器

通用寄存器 示例:讀取寄存器值 // 用戶態程序或內核代碼中均可使用 unsigned long reg_value; asm volatile ("mov %0, x10" // 將X10的值保存到reg_value變量: "r" (reg_value) ); printk("X10 0x%lx\n", reg_value);示例&…

超級好用的小軟件,連接電腦和手機。

將手機變成電腦攝像頭的高效工具Iriun Webcam是一款多平臺軟件,能夠將手機攝像頭變成電腦的攝像頭,通過簡單的設置即可實現視頻會議、直播、錄制等功能。它支持Windows、Mac和Linux系統,同時兼容iOS和Android手機,操作簡單&#x…

Mysql MIC高可用集群搭建

1、介紹 MySQL InnoDB Cluster(MIC)是基于 MySQL Group Replication(MGR)的高可用性解決方案,結合 MySQL Shell 和 MySQL Router,提供自動故障轉移和讀寫分離功能,非常適合生產環境 2、部署 …

PERL開發環境搭建>>Windows,Linux,Mac OS

特點 簡單 快速 perl解釋器直接對源代碼程序解釋執行,是一個解釋性的語言, 不需要編譯器和鏈接器來運行代碼>>速度快 靈活 借鑒了C/C, Basic, Pascal, awk, sed等多種語言, 定位于實用性語言,既具備了腳本語言的所有功能,也添加了高級語言功能 開源.免費 沒有&qu…

ubuntu改用戶權限

在 Linux 系統中,賦予普通用戶 sudo 權限可以讓他們執行一些需要 root 權限的命令,而不需要頻繁切換到 root 用戶。以下是具體步驟: 創建用戶(useradd和adduser兩種方式) 首先,需要創建一個新的用戶。可以使用 adduser 或 usera…

藍橋杯 web 學海無涯(axios、ecahrts)版本二

答案: // TODO: 待補充代碼// 初始化圖表的數據,設置周視圖的初始數據 option.series[0].data [180, 274, 253, 324, 277, 240, 332, 378, 101]; // 周數據(每周的總學習時長) option.xAxis.data ["2月第1周", "…

Java 大視界 -- Java 大數據在智慧文旅虛擬場景構建與沉浸式體驗增強中的技術支撐(168)

💖親愛的朋友們,熱烈歡迎來到 青云交的博客!能與諸位在此相逢,我倍感榮幸。在這飛速更迭的時代,我們都渴望一方心靈凈土,而 我的博客 正是這樣溫暖的所在。這里為你呈上趣味與實用兼具的知識,也…

API vs 網頁抓取:獲取數據的最佳方式

引言 在當今數字化時代,對于企業、研究人員以及開發人員而言,獲取準確且及時的數據是大多數項目成功的關鍵因素。目前,收集網頁數據主要有兩種常用方法,即使用 API(應用程序接口)和網頁抓取。然而&#xf…

車載以太網網絡測試-25【SOME/IP-報文格式-1】

目錄 1 摘要2 SOME/IP-報文格式2.1 **Service ID / 16 bits**2.2 **Method ID / Event ID / 16 bits**2.3 **Length / 32 bits**2.4 **Client ID / 16 bits**2.5 Session ID / 16 bits2.6 Protocol Version / 8 bits2.7 Interface Version / 8 bits2.8 Message Type / 8 bits2.…

Python數據可視化-第3章-圖表輔助元素的定制

環境 開發工具 VSCode庫的版本 numpy1.26.4 matplotlib3.10.1 ipympl0.9.7教材 本書為《Python數據可視化》一書的配套內容,本章為第3章-圖表輔助元素的定制 本章主要介紹了圖表輔助元素的定制,包括認識常用的輔助元素、設置坐標軸的標簽、設置刻度范…

小程序30-wxml語法-聲明和綁定數據

小程序頁面中使用的數據均需要在Page() 方法的 data對象中進行聲明定義 在將數據聲明好以后,在 WXML 使用 Mustache 語法 ( 雙大括號{{ }} ) 將變量包起來,從而將數據綁定 在 {{ }} 內部可以做一些簡單的運算,支持如下幾種方式: 算數運算三…

ubuntu開啟黑屏現象解決

文章目錄 前言一、問題描述二、解決方案1. 檢查顯卡驅動解決步驟: 2. 修復 GRUB 配置解決步驟: 3. 使用恢復模式解決步驟: 三、驗證與總結 前言 在使用 Ubuntu 操作系統時,一些用戶可能會遇到開機后屏幕黑屏的現象。這種問題可能…

Modbus TCP轉Profibus DP網關接防撞雷達與PLC通訊

Modbus TCP轉Profibus DP網關接防撞雷達與PLC通訊 在工業自動化領域,通信協議的多樣性既是技術進步的體現,也給系統集成帶來了挑戰。Modbus TCP和Profibus DP是兩種廣泛應用于不同場景下的通信標準,它們各有優勢但也存在著互操作性的需求。本…

分布式鎖方案-Redisson

分布式鎖:Redisson還實現了Redis文檔中提到像分布式鎖Lock這樣的更高階應用場景。事實上Redisson并沒有不止步于此,在分布式鎖的基礎上還提供了聯鎖(MultiLock),讀寫鎖(ReadWriteLock)&#xff…

【AI插件開發】Notepad++ AI插件開發實踐:從Dock窗口集成到功能菜單實現

一、項目背景與技術選型 在上篇文章實現"選中即問AI"功能的基礎上,本文重點解決AI對話窗口的集成與核心功能菜單的開發。通過Notepad插件體系,我們將實現以下功能矩陣: AI交互系統:支持自然語言提問與任務執行代碼智能…

ControlNet-Tile詳解

一、模型功能與應用 1. 模型功能 ControlNet-Tile模型的主要功能是圖像的細節增強和質量提升。它通過以下幾個步驟實現這一目標: 語義分割:模型首先對輸入的圖像進行語義分割,識別出圖像中不同的區域和對象。這一步是為了讓模型理解圖像的內…

英飛凌高信噪比MEMS麥克風驅動人工智能交互

導言 在英飛凌,我們一直堅信卓越的音頻解決方案對于提升消費類設備的用戶體驗至關重要。我們堅定不移地致力于創新,在主動降噪、語音透傳、錄音室錄音、音頻變焦和其他相關技術方面取得了顯著進步,對此我們深感自豪。作為MEMS麥克風的領先供…

【Azure】如何使用 Docker CLI 和 Compose 將容器部署到 Azure ACI

推薦超級課程: 本地離線DeepSeek AI方案部署實戰教程【完全版】Docker快速入門到精通Kubernetes入門到大師通關課AWS云服務快速入門實戰在云中運行容器可能既困難又令人困惑。有太多選項可供選擇,而且還需要理解從虛擬網絡到安全性的不同云服務的工作方式。更不用說編排器了。…