【Java】JVM 内存区域划分

【Java】如何保证集合的线程安全?
【Java】线程池优点 与传统方式对比

JVM 内存区域划分

文章目录

  • [JVM 内存区域划分](#JVM 内存区域划分)
    • [1. JVM 内存区域总体架构](#1. JVM 内存区域总体架构)
    • [2. 线程共享区域详解](#2. 线程共享区域详解)
    • [3. 线程私有区域详解](#3. 线程私有区域详解)
    • [4. JVM 内存区域功能对比](#4. JVM 内存区域功能对比)
    • [5. 内存区域交互关系](#5. 内存区域交互关系)
    • [6. JDK 版本内存区域演进](#6. JDK 版本内存区域演进)

1. JVM 内存区域总体架构

JVM内存区域 堆内存详细结构 方法区演进 线程共享区域 运行时数据区 线程私有区域 方法区 Method Area 堆内存 Heap 程序计数器 PC Register 虚拟机栈 JVM Stack 本地方法栈 Native Method Stack 年轻代 Young Generation Eden 区 Survivor 区 From Survivor To Survivor 老年代 Old Generation JDK 1.7: 永久代 PermGen JDK 1.8+: 元空间 Metaspace

2. 线程共享区域详解

堆内存结构 线程共享区域 Eden 区: 80% Young Generation Survivor 区: 20% From: 10% To: 10% 长期存活对象 Old Generation 大对象直接进入 存储对象实例 堆内存 Heap GC 主要管理区域 所有线程共享 存储类信息 方法区 Method Area 常量池 静态变量 JIT 编译代码 类版本/字段/方法信息 运行时常量池 字符串常量池

3. 线程私有区域详解

栈帧生命周期 线程私有区域 创建栈帧 方法调用 栈帧入栈 执行方法 栈帧出栈 方法结束 当前线程执行的字节码行号 程序计数器
PC Register 唯一没有OOM的区域 线程切换时保存执行位置 栈帧 Stack Frame 虚拟机栈
JVM Stack 局部变量表 Local Variables 操作数栈 Operand Stack 动态链接 Dynamic Linking 方法返回地址 Return Address 为Native方法服务 本地方法栈
Native Method Stack 与虚拟机栈类似

4. JVM 内存区域功能对比

JVM内存区域功能表 是否线程共享 内存区域 是否GC管理 可能异常 存储内容 线程私有 程序计数器 否 无 当前指令地址 线程私有 虚拟机栈 否 StackOverflowError
OutOfMemoryError 栈帧/局部变量 线程私有 本地方法栈 否 StackOverflowError
OutOfMemoryError Native方法信息 线程共享 堆内存 是 OutOfMemoryError 对象实例/数组 线程共享 方法区 是 OutOfMemoryError 类信息/常量/静态变量

5. 内存区域交互关系

对象创建流程 JVM内存交互 检查类加载 new 指令 分配内存 内存空间初始化 对象设置 执行init方法 方法区
存储类信息 类加载子系统 运行时常量池 虚拟机栈
方法执行 执行引擎 程序计数器
指令定位 堆内存
对象实例存储 创建对象 局部变量表
对象引用 本地方法栈
Native方法执行 本地方法接口 垃圾收集器

6. JDK 版本内存区域演进

线程共享区域:

  • 堆(Heap):对象实例存储,GC主要区域
  • 方法区(Method Area):类信息、常量、静态变量
  • 运行时常量池:类和接口的常量

线程私有区域:

  • 程序计数器(PC Register):当前指令地址
  • 虚拟机栈(JVM Stack):Java方法执行
  • 本地方法栈(Native Method Stack):Native方法执行

重要特点:

  1. 是最大的内存区域,被所有线程共享
  2. 程序计数器是唯一不会发生OOM的区域
  3. 虚拟机栈本地方法栈可能发生StackOverflowError
  4. JDK 8+ 使用元空间 替代永久代
  5. 所有区域都可能发生OutOfMemoryError(除程序计数器)

这些内存区域共同协作,支撑Java程序的运行,每个区域都有其特定的职责和生命周期管理机制。

相关推荐
benbenAItalk6 小时前
数字人口播视频的批量生产实践:素材规范、任务编排与质量验收
java·前端·音视频
sunshine22 girl6 小时前
Java学习二 基本语法2, 算术运算符
java·学习
2601_966949656 小时前
为什么量化策略需要大量历史股票数据?从回测可信度理解数据规模
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
niucloud-admin6 小时前
JAVA V6 多商户商城 开发文档——插件目录结构
java·开发语言
2601_962885726 小时前
如何用 Python 扫描 A 股跳空缺口并统计缺口回补概率?
java·前端·python
滕州市燕猫虎计算机科技工作室个体工商户7 小时前
Java锁
java·开发语言
多加点辣也没关系7 小时前
JavaScript|第31章:表单与控件
开发语言·javascript·ecmascript
菜鸟~noob2337 小时前
【电子战】 第09篇:阵列信号处理——波束形成、MVDR、MUSIC【含matlab代码】
开发语言·matlab·信号处理
ocean21037 小时前
2025-2026年Python面试高频知识点洞察
开发语言·python·面试·python八股文
零依赖极客8 小时前
Day 6·1 ARMv8.2 dotprod——vdotq_s32 一条指令做 4 个点积
c语言·开发语言·人工智能·矩阵·arm·vllm