Java 面试题
目录

Java 虚拟机 (JVM) 的内存区域有哪些?

· 约 3 分钟读完 · 第 113 / 274 章

推荐答案

Java 虚拟机 (JVM) 的内存区域主要分为以下几个部分:

  1. 方法区(Method Area)

    • 存储类信息、常量、静态变量、即时编译器编译后的代码等数据。
    • 在 JDK 8 及之前,方法区通常被称为“永久代”(PermGen),但在 JDK 8 之后,方法区被替换为“元空间”(Metaspace),元空间使用本地内存。
  2. 堆(Heap)

    • 堆是 JVM 中最大的一块内存区域,用于存储对象实例和数组。
    • 堆是所有线程共享的内存区域,是垃圾回收的主要区域。
    • 堆可以分为新生代(Young Generation)和老年代(Old Generation),新生代又分为 Eden 区、Survivor 区(From 和 To)。
  3. 虚拟机栈(VM Stack)

    • 每个线程在创建时都会创建一个虚拟机栈,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。
    • 栈帧是虚拟机栈的基本单位,每个方法调用都会创建一个栈帧。
  4. 本地方法栈(Native Method Stack)

    • 与虚拟机栈类似,但本地方法栈是为 JVM 调用本地(Native)方法服务的。
  5. 程序计数器(Program Counter Register)

    • 程序计数器是一块较小的内存空间,用于存储当前线程执行的字节码指令地址。
    • 每个线程都有独立的程序计数器,线程私有。

本题详细解读

方法区(Method Area)

方法区是 JVM 中用于存储类信息、常量、静态变量等数据的区域。在 JDK 8 之前,方法区被称为“永久代”(PermGen),但由于永久代的大小有限且容易导致内存溢出,JDK 8 之后引入了“元空间”(Metaspace),元空间使用本地内存,不再受限于 JVM 的内存设置。

堆(Heap)

堆是 JVM 中最大的一块内存区域,用于存储对象实例和数组。堆是所有线程共享的内存区域,是垃圾回收的主要区域。堆可以分为新生代和老年代,新生代又分为 Eden 区、Survivor 区(From 和 To)。新生代主要用于存放新创建的对象,而老年代则存放经过多次垃圾回收后仍然存活的对象。

虚拟机栈(VM Stack)

虚拟机栈是每个线程私有的内存区域,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每个方法调用都会创建一个栈帧,栈帧是虚拟机栈的基本单位。虚拟机栈的大小可以通过 JVM 参数进行设置。

本地方法栈(Native Method Stack)

本地方法栈与虚拟机栈类似,但它是为 JVM 调用本地(Native)方法服务的。本地方法栈的大小也可以通过 JVM 参数进行设置。

程序计数器(Program Counter Register)

程序计数器是一块较小的内存空间,用于存储当前线程执行的字节码指令地址。每个线程都有独立的程序计数器,线程私有。程序计数器是线程执行字节码的指示器,确保线程切换后能恢复到正确的执行位置。