JVM内存模型及存储内容详解

JVM内存模型主要分为以下几个部分,各自负责存储不同的数据内容:


1. 堆(Heap)

  • 存储内容:所有对象实例(new创建的对象)和数组
  • 特点
    • 线程共享,是垃圾回收(GC)的主要区域。
    • 进一步划分为新生代(Young Generation,包含Eden、Survivor区)和老年代(Old Generation)。
  • 异常OutOfMemoryError(当堆无法扩展时)。

2. 方法区(Method Area)

  • 存储内容
    • 类信息(如类名、方法、字段、访问修饰符等元数据)。
    • 运行时常量池(Runtime Constant Pool,包含字面量、符号引用)。
    • 静态变量(static变量)、JIT编译后的代码。
  • 特点
    • 线程共享,在Java 8前称为“永久代”(PermGen),Java 8后改为元空间(Metaspace)(使用本地内存,不再受JVM堆大小限制)。
  • 异常OutOfMemoryError(元空间溢出时)。

3. 虚拟机栈(JVM Stack)

  • 存储内容
    • 每个方法执行时创建的栈帧(Frame),包含:
      • 局部变量表(基本数据类型、对象引用)。
      • 操作数栈(执行字节码指令的临时操作数)。
      • 动态链接(指向方法区的方法引用)。
      • 方法返回地址(方法结束后返回的位置)。
  • 特点
    • 线程私有,生命周期与线程相同。
  • 异常
    • StackOverflowError(栈深度超过限制,如无限递归)。
    • OutOfMemoryError(扩展栈时无法申请足够内存)。

4. 本地方法栈(Native Method Stack)

  • 存储内容:为JVM调用**本地方法(Native方法,如C/C++实现)**服务的栈帧。
  • 特点
    • 线程私有,与虚拟机栈类似,但服务于Native方法。
  • 异常:同虚拟机栈(StackOverflowErrorOutOfMemoryError)。

5. 程序计数器(Program Counter Register)

  • 存储内容:当前线程执行的字节码指令地址(如果是Native方法,则为Undefined)。
  • 特点
    • 线程私有,唯一无OutOfMemoryError的区域。
    • 确保线程切换后能恢复到正确执行位置。

扩展:直接内存(Direct Memory)

  • 存储内容:通过NIODirectByteBuffer分配的堆外内存(由操作系统管理)。
  • 特点
    • 不属于JVM内存模型,但频繁使用可能导致OutOfMemoryError

总结:线程共享 vs 线程私有

区域线程共享?存储内容异常类型
对象实例、数组OutOfMemoryError
方法区(元空间)类信息、运行时常量池、静态变量OutOfMemoryError
虚拟机栈方法栈帧、局部变量StackOverflowError
本地方法栈Native方法栈帧StackOverflowError
程序计数器字节码执行地址

通过理解这些区域的作用和特点,可以更好地诊断内存溢出(OOM)或栈溢出(SOF)问题,并优化JVM参数(如-Xmx-Xss-XX:MaxMetaspaceSize)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

走过冬季

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值