HotSpot JVM 「01」Runtime Data Areas

108 阅读1分钟

01-运行时数据区分类

JVM 中定义了多个运行时数据区,根据它们创建、销毁的时机,可分为两类:

  1. per-VM,JVM启动时创建,退出时销毁。通常由 JVM 中所有的线程共享。
    1. 方法区
    2. 运行时常量池
  2. per-thread,线程创建时创建,退出时销毁。通常由线程独享。
    1. pc 寄存器
    2. 栈 / 本地方法栈

01.1-方法区

JVM 中的方法区可以类比于操作系统中的”text”段区。它用来存储 per-class 结构,例如运行时常量池、域和方法数据、方法和构造器代码等。

逻辑上,方法区是堆空间的一部分。

01.2-运行时常量池

每个类或接口的 .class 文件中都有一个 constant_pool 表,运行时常量池就是这个表的运行时表示。

注:这也意味着方法区中存在多个运行时常量池。

运行时常量池中的条目(Entry)分为两类:

  1. symbolic references,后续需要继续解析。
  2. static constants,后续无需再处理。

01.3-栈 / 本地方法栈

在 HotSpot JVM 实现中,两者是合并在一起的。

栈中存储的是一种称为栈帧(frame)的数据结构。栈帧在方法调用是创建,在方法调用完成(正常返回或异常中断)时销毁。

Snipaste_2022-03-03_15-12-34.png