温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java内存结构怎么划分

发布时间:2026-09-19 03:50:18 来源:亿速云 阅读:98 作者:小樊 栏目:编程语言

Java 的内存结构(通常指 JVM 运行时数据区)在 JDK 8 之前和之后 有一定变化,下面以 JDK 8 及之后 的主流划分为准说明,并补充历史变化。


一、JVM 运行时内存整体划分(JDK 8+)

┌──────────────────────────────────────────┐
│                JVM 内存                  │
├──────────────┬───────────────────────────┤
│  线程私有区   │       线程共享区          │
├──────────────┼───────────────────────────┤
│ 程序计数器   │ 堆(Heap)                │
│ Java 虚拟机栈│ 方法区(元空间 Metaspace)│
│ 本地方法栈   │                           │
└──────────────┴───────────────────────────┘

二、线程私有区域(每个线程一份)

1️⃣ 程序计数器(Program Counter Register)

  • 当前线程所执行的 字节码行号指示器
  • 线程切换后能恢复到正确执行位置
  • 唯一不会 OOM 的区域
  • 生命周期:随线程创建和销毁

2️⃣ Java 虚拟机栈(JVM Stack)

  • 每个方法执行时创建一个 栈帧(Stack Frame)
  • 栈帧包含:
    • 局部变量表
    • 操作数栈
    • 动态链接
    • 方法返回地址
  • 存储:基本类型、对象引用
  • 异常:
    • StackOverflowError(栈深度过大)
    • OutOfMemoryError

3️⃣ 本地方法栈(Native Method Stack)

  • 为 native 方法(C/C++)服务
  • HotSpot 中直接与 JVM 栈合二为一

三、线程共享区域

4️⃣ 堆(Heap)✅ 最重要

  • JVM 中 最大的一块内存
  • 存放:
    • 对象实例
    • 数组
  • 是 垃圾回收的主要区域(GC Heap)
  • 可细分(仅逻辑划分):
    • 新生代
      • Eden
      • Survivor(From / To)
    • 老年代
  • 异常:OutOfMemoryError: Java heap space

5️⃣ 方法区(Method Area)

  • 存储:
    • 类信息
    • 常量
    • 静态变量
    • 即时编译器编译后的代码
  • JDK 8 之前:叫 永久代(PermGen)
  • JDK 8 之后:改为 元空间(Metaspace)
    • 使用 本地内存(Native Memory)
    • 默认不限制大小(受物理内存限制)

四、JDK 7 / 8 变化重点

项目 JDK 7 及之前 JDK 8 及之后
方法区实现 永久代 元空间
字符串常量池 永久代 堆
静态变量 永久代 堆

五、直接内存(补充)

  • 不属于 JVM 运行时数据区
  • 使用 NIO 的 DirectByteBuffer
  • 受本机内存限制
  • 异常:OutOfMemoryError: Direct buffer memory

六、一句话总结

Java 内存分为 线程私有(程序计数器、虚拟机栈、本地方法栈) 和 线程共享(堆、元空间),其中 堆是 GC 核心,元空间替代了永久代。

如果你愿意,我也可以:

  • 画一张 内存结构图
  • 结合 对象创建过程 讲
  • 对比 JMM(Java 内存模型) 和内存结构区别
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手