首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

JVM 內存區域全景解析:運行時數據區深度圖解

     編輯:Java 綜合教學

JVM 內存區域全景解析:運行時數據區深度圖解

許多開發者將 Java 內存簡化為「堆」與「棧」,實則 JVM 規範定義了多個職責明確的運行時數據區。本文依據《深入理解 Java 虛擬機》與 JVM 規範,系統梳理各區域功能、異常與調優要點。

1. 程序計數器

  • 作用:當前線程執行的字節碼行號指示器,分支/循環/跳轉/異常/線程恢復均依賴它。
  • 特點:線程私有、生命週期與線程同步、唯一不會 OOM 的區域。
  • 值:執行 Java 方法時為字節碼地址;執行 Native 方法時為 Undefined。

2. Java 虛擬機棧

  • 作用:描述 Java 方法執行內存模型。每次方法調用創建一幀,存儲局部變量表、操作數棧、動態鏈接、方法出口。
  • 局部變量表:基本類型、引用類型、returnAddress。long/double 佔 2 Slot,其餘 1 Slot。編譯期確定大小,運行期不變。
  • 異常:StackOverflowError(棧深度超限)、OutOfMemoryError(動態擴展失敗)。

3. 本地方法棧

  • 服務 Native 方法,功能與虛擬機棧類似。HotSpot 直接合二為一。同樣拋出 SOE/OOM。

4. Java 堆

  • 核心地位:最大塊、線程共享、啟動時創建、幾乎所有對象實例/數組在此分配。
  • GC 主戰場:又稱「GC 堆」。現代收集器採用分代:新生代、老年代;新生代細分 Eden、From Survivor、To Survivor。
  • TLAB:線程私有分配緩衝,提升分配效率。
  • 參數:-Xms 初始、-Xmx 最大、-Xmn 新生代。不可擴展時拋 OOM。

5. 方法區

  • 存儲:類信息、常量、靜態變量、JIT 編譯代碼。
  • 共享、啟動創建、邏輯屬於堆一部分但可獨立實現。
  • JDK 8+ 變化:永久代移除,改為 Metaspace(元空間),使用本地內存,參數 -XX:MetaspaceSize、-XX:MaxMetaspaceSize。
  • 異常:無法分配拋 OOM。

6. 運行時常量池

  • 屬於方法區一部分。存放編譯期字面量、符號引用,類加載後進入。具備動態性:String.intern() 可運行期放入新常量。受方法區內存限制,滿則 OOM。

7. 直接內存

  • 非 JVM 規範區域,但 NIO DirectByteBuffer 通過 Native 分配,避免堆內外拷貝。受 -XX:MaxDirectMemorySize 限制,耗盡拋 OOM。

總結圖表

區域共享性主要內容典型異常關鍵參數
程序計數器私有字節碼行號無無
虛擬機棧私有幀(局部變量/操作數棧/動態鏈接)SOE/OOM-Xss
本地方法棧私有Native 方法幀SOE/OOM-XX:MaxDirectMemorySize
Java 堆共享對象實例/數組OOM-Xms/-Xmx/-Xmn
方法區/元空間共享類/常量/靜態變量/JIT 代碼OOM-XX:MetaspaceSize
運行時常量池共享字面量/符號引用/直接引用OOM同上
直接內存共享NIO 堆外緩衝OOM-XX:MaxDirectMemorySize
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved