JVM

JVM 内存结构主要包括堆(Heap)、栈(Stack)、方法区(Method Area)、程序计数器(Program Counter)和本地方法栈(Native Method Stack)。下面简要介绍这三个区域的职责和存储内容:

1. 堆(Heap):

  • 职责: 堆是 Java 虚拟机用于存储对象实例的区域。它是被所有线程共享的内存区域。
  • 存储内容: 主要存储对象实例,包括实例变量、数组等。堆是在 Java 程序运行时动态分配和回收内存的区域,由垃圾回收器负责管理。

2. 栈(Stack):

  • 职责: 栈是每个线程私有的,用于存储方法调用和局部变量的区域。每个方法调用都会在栈上创建一个栈帧,用于存储方法的局部变量、操作数栈、方法返回地址等信息。
  • 存储内容: 主要存储局部变量、方法参数、操作数栈和方法调用的状态。栈是一个后进先出(LIFO)的数据结构。

3. 方法区(Method Area):

  • 职责: 方法区是用于存储类的元信息、静态变量、常量池、方法代码等信息的区域。在 Java 8 及之前的版本,方法区被称为永久代。在 Java 8 及之后的版本,永久代被移除,方法区的内容被移到元空间(Metaspace)。
  • 存储内容: 主要存储类的元数据信息、静态变量、常量池、方法代码等。方法区是被所有线程共享的。

需要注意的是,虽然 Java 8 及之后的版本移除了永久代,但方法区的内容仍然存在,只是被称为元空间。元空间的特点是它不再有固定的大小,而是根据需要动态分配。此外,元空间的垃圾回收由 JVM 来处理。