Java中JVM内存结构(完整)

1. 程序计数器(PC寄存器)

  • 作用:记录每个线程当前执行的字节码指令的地址。
  • 特点
    • 独立性:每个线程都有自己的程序计数器,彼此独立,不会相互影响。
    • 线程切换:线程执行时,程序计数器记录当前字节码指令地址;当线程切换时,通过程序计数器恢复原来的执行位置。
    • 内存管理:不会发生 OutOfMemoryError(内存溢出),因为程序计数器占用的内存很小。

2. Java 虚拟机栈

  • 作用:管理方法执行过程中创建的栈帧,存储局部变量、操作数栈、动态链接和方法返回地址。
  • 特点
    • 栈帧(Stack Frame):每个方法在调用时会创建一个栈帧,它是虚拟机栈的基本数据单元。栈帧会随着方法的调用和返回进出虚拟机栈。
    • 局部变量表:用于存储方法内部的变量,包括基本数据类型(如 intlong)和对象引用。空间大小在编译期间已确定。
    • 操作数栈:执行方法中的指令时用于保存中间结果,从局部变量表中加载数据,执行计算和操作等。
    • 动态链接:用于支持方法调用,包括解析运行时方法的具体地址。
    • 方法返回地址:保存方法执行完后返回的位置,便于上层调用方法继续执行。
  • 异常
    • StackOverflowError:当栈的深度超过虚拟机所允许的最大值。
    • OutOfMemoryError:当栈需要的内存超出系统可用的内存。

3. 本地方法栈

  • 作用:专门用于执行本地方法(native),与虚拟机栈功能类似,但它支持使用非 Java 语言编写的代码(例如 C/C++)。
  • 特点
    • 线程独立:本地方法栈也是每个线程私有的,与虚拟机栈类似,执行本地方法时会创建本地栈帧。
    • JNI(Java Native Interface):通过 JNI 技术,Java 方法可以调用本地方法以提高性能或访问底层系统资源。
    • 存储内容:本地方法栈中存储非 Java 代码执行的状态、调用的参数和返回结果。
  • 异常
    • StackOverflowError:栈溢出。
    • OutOfMemoryError:系统内存不足时出现的错误。

4. 堆(Heap)

  • 作用:用于存储所有线程共享的对象实例和数组,是 Java 内存中最大的区域。
  • 特点
    • 线程共享:堆是各线程共享的内存区域,存放所有对象实例和数组。
    • 垃圾回收:堆是垃圾回收的主要管理区域,未被引用的对象会被 GC 回收。
    • 分代结构
      • 年轻代(Young Generation):存放新生成的对象,GC频繁。包括:
        • Eden区:绝大多数新生对象先进入 Eden 区。
        • Survivor区:包括 From Survivor 和 To Survivor 两个小区域,Eden 区中存活下来的对象会被转移到 Survivor 区。
      • 老年代(Old Generation):存放生命周期长的对象。当对象在年轻代多次 GC 后依然存活,则会被移入老年代。
      • 永久代(或元空间 Metaspace)
        • 永久代(JDK 7 及之前):存放类元数据,如类信息、常量等。
        • 元空间(JDK 8 及之后):与永久代功能相似,但使用的是系统内存而非堆内存。
  • 异常
    • OutOfMemoryError:当堆中没有足够的空间分配新对象时会抛出。

5. 方法区

  • 作用:存储已加载的类信息、常量池、静态变量、即时编译器(JIT)编译后的代码等。
  • 特点
    • 运行时常量池:用于存储编译期生成的字面量和符号引用。类加载后,常量池中的内容会被动态解析为内存地址。
    • 类信息:存放类元数据,包括类名、方法、字段等信息,便于类加载后能直接访问其结构。
    • JIT编译后的代码:即时编译器编译后的方法字节码,能提高性能。
    • 元空间(JDK 8 引入):元空间与方法区的功能相似,但元空间使用的是系统内存,而非堆内存。
  • 异常
    • OutOfMemoryError:在大量动态生成类或大量使用静态变量时,方法区内存不足可能会导致 OutOfMemoryError

总结

完整的 JVM 内存结构分为程序计数器、虚拟机栈、本地方法栈、堆和方法区。各区域协作,管理 Java 程序的执行过程、对象生命周期和方法调用等,确保 JVM 的高效和稳定运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值