JVM内存结构全景:5大区域详解

引言:为什么要理解JVM内存结构? 当你遇到以下问题时,是否感到困惑: StackOverflowError 和 OutOfMemoryError 有什么区别? 为什么有的对象存储在堆中,有的却在栈中? 静态变量存储在哪里?方法代码又存储在哪里? 为什么多线程之间可以共享对象,却不能共享局部变量? 这些问题的答案,都藏在 JVM内存结构 中。 理解JVM内存结构是深入学习JVM的基础: 性能调优:知道内存如何分配,才能优化内存参数 问题排查:90%的内存问题与内存区域的使用不当相关 代码优化:理解对象存储位置,才能写出高效代码 本文将带你建立JVM内存结构的全景认知,为后续深入学习每个区域打下基础。 JVM内存结构全景图 运行时数据区概览 当Java程序运行时,JVM会将内存划分为不同的数据区域,这些区域统称为 运行时数据区(Runtime Data Area)。 根据《Java虚拟机规范》,JVM运行时数据区包括以下5大区域: ┌─────────────────────────────────────────────────────────┐ │ JVM 运行时数据区 │ ├─────────────────────────────────────────────────────────┤ │ │ │ ┌──────────────────┐ ┌──────────────────┐ │ │ │ 程序计数器 │ │ 程序计数器 │ 线程私有 │ │ │ (PC Register) │ │ (PC Register) │ │ │ └──────────────────┘ └──────────────────┘ │ │ │ │ ┌──────────────────┐ ┌──────────────────┐ │ │ │ 虚拟机栈 │ │ 虚拟机栈 │ 线程私有 │ │ │ (VM Stack) │ │ (VM Stack) │ │ │ └──────────────────┘ └──────────────────┘ │ │ │ │ ┌──────────────────┐ ┌──────────────────┐ │ │ │ 本地方法栈 │ │ 本地方法栈 │ 线程私有 │ │ │ (Native Stack) │ │ (Native Stack) │ │ │ └──────────────────┘ └──────────────────┘ │ │ │ ├─────────────────────────────────────────────────────────┤ │ │ │ ┌───────────────────────┐ │ │ │ 堆内存 │ 线程共享 │ │ │ (Heap) │ │ │ │ │ │ │ │ ┌─────────────────┐ │ │ │ │ │ 新生代 (Young) │ │ │ │ │ │ Eden + S0 + S1 │ │ │ │ │ └─────────────────┘ │ │ │ │ ┌─────────────────┐ │ │ │ │ │ 老年代 (Old) │ │ │ │ │ └─────────────────┘ │ │ │ └───────────────────────┘ │ │ │ │ ┌───────────────────────┐ │ │ │ 方法区 │ 线程共享 │ │ │ (Method Area) │ │ │ │ │ │ │ │ · 类信息 │ │ │ │ · 常量池 │ │ │ │ · 静态变量 │ │ │ │ · JIT编译后的代码 │ │ │ └───────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────┘ ┌───────────────────────┐ │ 直接内存 │ (堆外内存) │ (Direct Memory) │ │ │ │ · NIO Buffer │ │ · Netty Zero-Copy │ └───────────────────────┘ 关键特征: ...

2025-11-20 · maneng

JVM架构全景图:五大核心组件详解

引言 为什么要学习这个主题? 在前两篇文章中,我们知道了Java程序如何运行,以及JVM的本质。但JVM内部到底是怎么工作的? 想象一下: 一个.class文件是如何被加载到JVM中的? 对象和变量存储在哪里? 字节码是如何被"翻译"成机器码的? 理解JVM的架构,就像理解一台计算机的组成(CPU、内存、硬盘)一样重要。这是后续学习类加载、内存管理、GC调优的基础。 你将学到什么? ✅ JVM的整体架构图 ✅ 五大核心组件的职责 ✅ 各组件如何协作运行Java程序 ✅ JVM的完整执行流程 一、JVM架构全景图 1.1 整体架构 ┌─────────────────────────────────────────────────────────────┐ │ Java应用程序 │ │ (.java → .class) │ └──────────────────────┬──────────────────────────────────────┘ │ 字节码 ↓ ┌─────────────────────────────────────────────────────────────┐ │ JVM(Java虚拟机) │ │ │ │ ┌────────────────────────────────────────────────────────┐ │ │ │ 1️⃣ 类加载子系统 (Class Loader Subsystem) │ │ │ │ - 加载 (Loading) │ │ │ │ - 链接 (Linking): 验证、准备、解析 │ │ │ │ - 初始化 (Initialization) │ │ │ └────────────────────────────────────────────────────────┘ │ │ ↓ │ │ ┌────────────────────────────────────────────────────────┐ │ │ │ 2️⃣ 运行时数据区 (Runtime Data Areas) │ │ │ │ │ │ │ │ 【线程共享】 【线程私有】 │ │ │ │ - 堆 (Heap) - 程序计数器 (PC Register)│ │ │ │ - 方法区 (Method Area) - 虚拟机栈 (VM Stack) │ │ │ │ - 本地方法栈 (Native Stack)│ │ │ └────────────────────────────────────────────────────────┘ │ │ ↓ │ │ ┌────────────────────────────────────────────────────────┐ │ │ │ 3️⃣ 执行引擎 (Execution Engine) │ │ │ │ - 解释器 (Interpreter) │ │ │ │ - JIT编译器 (Just-In-Time Compiler) │ │ │ │ - 垃圾收集器 (Garbage Collector) │ │ │ └────────────────────────────────────────────────────────┘ │ │ ↓ │ │ ┌────────────────────────────────────────────────────────┐ │ │ │ 4️⃣ 本地接口 (Native Interface - JNI) │ │ │ └────────────────────────────────────────────────────────┘ │ │ ↓ │ │ ┌────────────────────────────────────────────────────────┐ │ │ │ 5️⃣ 本地方法库 (Native Method Libraries) │ │ │ └────────────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────────┐ │ 操作系统 & 硬件 │ └─────────────────────────────────────────────────────────────┘ 1.2 核心组件概览 组件 作用 类比 类加载子系统 加载、链接、初始化类 快递员(把包裹送到仓库) 运行时数据区 存储数据(对象、变量、代码) 内存/仓库 执行引擎 执行字节码 CPU(执行指令) 本地接口 调用操作系统API 操作系统接口 垃圾收集器 自动回收无用对象 清洁工(清理垃圾) 二、类加载子系统(Class Loader Subsystem) 2.1 职责 负责将.class文件加载到JVM内存中,并准备好供使用。 ...

2025-11-20 · maneng

如约数科科技工作室

浙ICP备2025203501号

👀 本站总访问量 ...| 👤 访客数 ...| 📅 今日访问 ...